PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ -> BMP: Pixel bearbeiten/verschieben


Frank
2003-10-24, 19:35:59
Kennt jemand zufällig ein kleines Tutorial oder eine Befehlssammlung, wie man auf ein Bitmap zugreift und verändert (pixelweise)?

Danke :)

Demirug
2003-10-24, 19:40:14
Eine Bitmapdatei oder ein Bitmap im GDI?

Frank
2003-10-24, 19:43:56
eine einfache Bitmapdatei. ... *.bmp - oder halt entsprechend anderes geeignetes Format.

Demirug
2003-10-24, 20:07:37
Dort findet man eigentlich den ganzen Code den man zum Laden/Speichern und bearbeiten von Grafikdateien so braucht http://www.codeproject.com/bitmap/cximage.asp

Crushinator
2003-10-25, 20:13:51
^^ Boooaaaah!!!!

Demi, Du hast mit Deinem Link ein lange bestehendes Problem meinerseits gelöst: Wie kann ich einen immer bekannten Filter-Algorythmus auf alle Dateien eines Verzeichnisses anwenden, ohne dabei eine extra Photoshop-Lizenz für die Maschine zu haben.

Ich habe mir den Code angeschaut und einen kurzen Test gemacht. In meinem speziellen Falle ginge es sogar schneller als mit der Automatisierung unter Photoshop.

Danke, danke!!!11eins :massa:

Frank
2003-10-26, 21:17:38
Original geschrieben von Demirug
Dort findet man eigentlich den ganzen Code den man zum Laden/Speichern und bearbeiten von Grafikdateien so braucht http://www.codeproject.com/bitmap/cximage.asp Irgendwie gewinn ich da nicht den Überblick. Ist das denn so kompliziert ein Bitmap zu öffnen, 2..3 Pixel einfach zu verschieben und dann als neues Bitmap speichern zu lassen? Will mir ja nix anzeigen lassen oder sonstiges. :-(

Ich dach mit 4..5 Befehlen wär das abgehakt. hmmm *such*

Demirug
2003-10-26, 21:24:34
Original geschrieben von Frank
Irgendwie gewinn ich da nicht den Überblick. Ist das denn so kompliziert ein Bitmap zu öffnen, 2..3 Pixel einfach zu verschieben und dann als neues Bitmap speichern zu lassen? Will mir ja nix anzeigen lassen oder sonstiges. :-(

Ich dach mit 4..5 Befehlen wär das abgehakt. hmmm *such*

Ganz so einfach ist es leider nicht. Wenn man es nur mit einer festen Auflösung zu tun hat kann man einiges vereinfachen aber so ist es eben ein bischen Aufwendig.

Ich persönlich bin da ja inzwischen recht faul geworden und benutzte entweder die .Net Klassen oder DirectX dafür.

Frank
2003-10-26, 21:37:57
Original geschrieben von Demirug
Ganz so einfach ist es leider nicht. Wenn man es nur mit einer festen Auflösung zu tun hat kann man einiges vereinfachen aber so ist es eben ein bischen Aufwendig.

Ich persönlich bin da ja inzwischen recht faul geworden und benutzte entweder die .Net Klassen oder DirectX dafür. Andere Klassen kann(darf) ich nicht verwenden. Zum anzeigen des Bildes brauch ich eigentlich wirklich nix machen - speichern reicht. :(

Was ist eigentlich mit diesen SetPixel & Co Befehlen. Die stehen ja in der MSDN unter GDI(+). Geht das aber auch ohne irgendwelche Windowseigene Libaries?

Demirug
2003-10-26, 21:46:04
Original geschrieben von Frank
Andere Klassen kann(darf) ich nicht verwenden. Zum anzeigen des Bildes brauch ich eigentlich wirklich nix machen - speichern reicht. :(

Was ist eigentlich mit diesen SetPixel & Co Befehlen. Die stehen ja in der MSDN unter GDI(+). Geht das aber auch ohne irgendwelche Windowseigene Libaries?

GDI(+) ist eine Windows Sache und wenn ich dich richtig verstanden haben muss es reines C++ ohne die verwendung von irgendwelchen Betriebsystemspezifichen Funktionen sein, oder?

Beschreib das Problem doch bitte mal etwas genauer möglicherweise findet sich dann eine einfachere Lösung dafür.

Frank
2003-10-26, 22:40:03
Original geschrieben von Demirug
GDI(+) ist eine Windows Sache und wenn ich dich richtig verstanden haben muss es reines C++ ohne die verwendung von irgendwelchen Betriebsystemspezifichen Funktionen sein, oder?

Beschreib das Problem doch bitte mal etwas genauer möglicherweise findet sich dann eine einfachere Lösung dafür. Windowseigene Sachen wären schlecht, da die Möglichkeit bestehen soll, den Code in ein Userplattform-unabhängiges Gesamtprogramm einzuarbeiten. (oder halt extra anzusprechen - wie auch immer; ist jetzt ja egal)

Das Programm soll lediglich ein Bitmap öffnen (bmp). In den Bitmap werden alle Pixel etwas verschoben. (Jeder Pixel wird einzeln mittels spezieller Matrix transformiert.) Das ganze soll als neues Bild abgespeichert werden. (das ist dann genausogroß wie das Alte)

Crushinator
2003-10-27, 01:30:34
^^ Schau' Dir doch einfach mal das unter \demo2 abgelegte Projekt von Demis Link an:


int main(int argc, char* argv[])
{
/* (...) */

CxImage image;

/* Laden wir mal die Datei als "typein" -> bmp, jpg etc. */

if (!image.Load(argv[1],typein)){
fprintf(stderr, "%s\n", image.GetLastError());
fprintf(stderr, "error loading %s\n", argv[1]);
return 1;
}

/* von mir dazu gesponnenes Ändern eines Pixelfarbwertes */
image.SetPixelColor(x,y,MyColor);


/* Speichern wir's in der Form "typeout" ab */

if (!image.Save(argv[2],typeout)){
fprintf(stderr, "%s\n", image.GetLastError());
fprintf(stderr, "error saving %s\n", argv[2]);
return 1;
}
printf("Done!\n");
return 0;
}

So einfach wäre das, wenn Dein Problem mit den Extra-Klassen nicht existieren würde.

Dann lautet die Lösung ja vielleicht die "bmp.c" aus dem (http://www.brillianet.com/cgi-bin/download.cgi?/programming/c_and_cpp/source_code/common.zip) hier. Wobei es sich um ein DOS-Programm handelt -> Die nicht benötigten Teile (Anzeigen, #include <dos.h> und <64 K Prüfung) rausschmeißen, far_malloc, far_fread usw. in normale Varianten ändern und schon dürfte das fast überall kompilierfähig sein. Das Speichern - was da nicht enthalten sit - dürfte selbsterklärend sein, nämlich durch einfaches schreiben des gelesenen und veränderten Buffers in eine Datei. =)

Xmas
2003-10-27, 01:43:50
Das BMP Dateiformat (http://www.fortunecity.com/skyscraper/windows/364/bmpffrmt.html)

Die Definition der beiden structs kannst du dir aus wingdi.h kopieren. Dann liest du (mit open, read oder was auch immer) die beiden structs aus der Datei, allokierst ein Array das die Bilddaten aufnehmen kann und liest diese aus der Datei.
Auf dem Array führst du deine Operationen aus, dann schreibst du beide Header in eine neue Datei, und die Bilddaten hinterher.

Je nach Art der Bearbeitung ist es einfacher, die Daten von 24Bit RGB nach 32Bit RGB(A) umzuwandeln, dann entspricht jeder Array-Index eines int-Arrays einem Pixel.