Schnelle/Effiziente Pixeloperationen

Alles rund um die Programmierung mit Qt
Antworten
Mati
Beiträge: 66
Registriert: 4. Januar 2006 00:11

Schnelle/Effiziente Pixeloperationen

Beitrag von Mati »

Hallo,

meine Anwendung kann bereits Bilder laden. Ich würde gern auf einzelne Pixel des Bildes zugreifen. Ich glaube/weiß dass dafür Zugriffe über QT gibt aber ich bin mir unsicher ob diese auch effizient/schnell sind? Gibt es sonst eine andere Möglichkeit überhaupt auf Pixel zuzugreifen (vielleicht auch was anderes als OpenGL?). Oder muss man da irgendwie auf os-funktionen zurückgreifen...wenn ja: ist diese Methodik überhaupt schneller als über QT ?

Ich weiß nicht ob sich jemand auskennt aber ich würde gerne Bilder "stören" also ein Blurring darauf anwenden...wenn jemand erfahrung hat...
Oder auch einfacher...wenn ich einen Gaußfilter implementieren wollen würde...im Grunde muss ich die neuen Pixeldaten nur über eine Gewichtung von Nachbarpixeln errechen....d.h. ich operiere doch mit den RGB-werten also nur den Farbwerten oder? Was anderes kann es doch nicht sein oder?
Oder wie soll ich Pixel sonst verrauschen lassen?

Danke für jede Info!
Eltharion
Beiträge: 74
Registriert: 4. Mai 2006 14:42
Wohnort: Magdeburg
Kontaktdaten:

Beitrag von Eltharion »

Ich weiss leider nicht, wie es in Deinem Code aussieht, aber vor langer Zeit (das sage ich nur für den Fall, dass irgendwas mit meinem Code nicht mehr so kompiliert ;-) ) hatte ich das gelöst, indem ich ein QFrame abgeleitet und eine extra QPixmap mit meinen Daten eingeführt hatte. Keine Ahnung, ob man das heute auch noch so macht:

Code: Alles auswählen

class Canvas : public QFrame
{
  Q_OBJECT

  public:
    Canvas (QWidget *parent=0, const char *name=0);
    virtual ~Canvas ();

    void paintEvent  (QPaintEvent *);
    void resizeEvent (QResizeEvent *);

    void SetPixel  (int x, int y, int color);

  protected:
    QPixmap *m_pixmap;
};
Implementierung:

Code: Alles auswählen

Canvas :: Canvas (QWidget *parent, const char *name)
 : QFrame(parent, name)
{
  setBackgroundColor(white);

  m_pixmap = new QPixmap(width(), height(), -1);
}

Canvas :: ~Canvas ()
{
  if (m_pixmap) delete m_pixmap;
}

void Canvas :: paintEvent  (QPaintEvent *)
{
  QPainter paint;

  paint.begin(this);
  paint.drawPixmap(0, 0, *m_pixmap);
  paint.end();
}

void Canvas :: resizeEvent (QResizeEvent *)
{
  m_pixmap->resize(width(), height());
  m_pixmap->fill(white);
}

void Canvas :: SetPixel (int x, int y, int color)
{
  QPainter paint(m_pixmap);

  // Hier hatte ich die Farbe als RGB aus 'color' bestimmt.
  // Also anpassen. Ggf. die Farbwerte einfach übergeben.

  paint.setPen(QColor((int) r, (int) g, (int) b));
  paint.drawPoint(x, y);
  paint.end();
}
Ansonsten schaue ich mir bei Ideenlosigkeit immer die Qt-Beispiele an. Auch die Quelltexte von Qt/KDE-Programmen mit ähnlichen Funktionen sind oft brauchbar.

MfG, E*

PS: Der Quelltext stammt aus Fractalia, einem sehr alten Mandelbrot/Fraktal-Anzeiger.
Mati
Beiträge: 66
Registriert: 4. Januar 2006 00:11

Beitrag von Mati »

danke für Deine Hilfe ..
weiß jemand was zur Performance von Qt bzw. in diesem Fall zu den Pixel-setzoperation von Qt oder den Leseoperationen ?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Verwende QImage. Wenn du dich nicht gerade auf nur ein Grafikformat beschränken willst und dann das ganze noch selbst verwalten willst, wirst du es nicht mehr viel schneller hinbekommen.
Antworten