Bild laden/ändern/speichern

Busti

Mitglied
Hallo zusammen,

ich möchte in C++ gerne ein Bild laden, formatunabhängig (bmp, jpg, gif, png).
Danach die Attribute wie Länge, Breite etc. auslesen, ggf. diese Attribute ändern und das Bild entweder überschreiben oder als neues Bild speichern.

Mir fehlt aber irgendwie schon der Ansatz, wäre nett, wenn ihr mir etwas helfen könntet und/oder ein Beispiel geben könntet.

Viele Grüße, Busti
 
Hier mal ein erster Link bzgl. Bildformate. Das sollte dir ein klein wenig beim Ansatz helfen. Der Text im Link beinhaltet auch eine Menge Stichworte, mit denen sich dann weiter googeln lässt. :)
 
Geht das nicht so einfach wie in Java?

Code:
File file;
file = new File("bild.jpg");
      
System.out.println("Quelle: "+file.getAbsolutePath());
         
BufferedImage ima = ImageIO.read(file);
FileImageInputStream fiis = new FileImageInputStream(file);
      
System.out.println("Breite x Hoehe: "+ima.getWidth()+" x "+ima.getHeight());
      
float groesse = Math.round(fiis.length()/10.24f)/100f;
System.out.println("Groesse: "+groesse+" KB");
      
System.out.println("Bittiefe: "+ima.getColorModel().getPixelSize()+" Bit");
 
Nein, eben:
In Java sind nur ein Haufen vorgefertigte Klassen im EInsatz, die intern irgendwas...
machen, versuchs doch besser mit dem link vom CSANecromancer...
die Klasse von sunnybunny ist eher nicht das, was du gesucht hast, glaub ich zumindest...
zum bildbearbeiten generell braucht man halt ein verständnis dafür, wie das zeug abgespeichert wird...für jpg etc gibt fertige dlls zum downloaden, bmp muss man selber verstehen.

Gruß
 
Geht das nicht so einfach wie in Java?
Das hängt von der Umgebung bzw. den vorhandenen Bibliotheken ab. Bei C++ sind die Kombinationen von Sprache und Bibliotheken sehr vielfältig und das reicht von rudimentär bis komfortabel :)

Da ich mal vermute, dass du für Windows programmierst (welche Entwicklungsumgebung?) ist die Nutzung von GDI+ eine ganz gute Wahl, weil man damit auf zusätzliche Bibliotheken verzichten kann.

Gruß
MCoder
 
Huhu.
[...]
die Klasse von sunnybunny ist eher nicht das, was du gesucht hast, glaub ich zumindest...
[...]

Da hast Du wohl recht, wenn es um Bildbearbeitung geht. :)
Und auch so habe ich gesehen, dass ich eine erweiterte PictureHolderklasse aus einem CodeGuru - Projekt benutze:
Hier der Link

Da die Anfrage aber Folgende war:

busti hat gesagt.:
Danach die Attribute wie Länge, Breite etc. auslesen, ggf. diese Attribute ändern und das Bild entweder überschreiben oder als neues Bild speichern.

Und dafür reicht die Erweiterte Pictureholderklasse meines Erachtens aus,
da man Bilder laden, skalieren und speichern kann, ob es mit Pixel UND Verktorgrafiken geht weiss ich allerdings nicht, da das auch nicht so mein Hauptgebiet ist. :)

Aber es gibt ja wie fast immer 100e Wege ;-)

Gruß SunnyBunny
 
Zuletzt bearbeitet:
Naja
ich hoffe, es nimmt mir keiner übel, dass ich prinzipiell
immer den lern-aufwänigeren Weg wähle, ist angeboren :)
Wenn busti dass wirklich nur zum skalieren etc braucht, wirds wohl auch gehen

gruß
 
Ok, es gibt auch Pakete, die das Gewünschte können, wie z.B. die Lead Tools. Da hat man dann alles: Unterstützung sämtlicher Grafikformate, volle Bildmanipulation, alles unabhängig davon ob Raster- oder Vektorgrafik. Nur kostet das Ganze dann auch einen Arm und ein Bein.

Da ich schon vor einem ähnlichen Problem stand, habe ich mir einfach selber Im- und Export-Routinen für die gewünschten Grafikformate gebastelt (und genau dafür ist auch mein Link gedacht, dessen Inhalt auch recht bald klar macht: "Nein, das ist nicht so simpel. Die verschiedenen Garfikformate gibt es nicht nur wegen der lustigen Kürzel hinten dran...") und im Programm intern für die Bildtransformationen dann grundsätzlich Standardbitmaps verwendet. Ist nicht besonders ressourcenschonend, aber wenn ich die Wahl habe zwischen CPU-Zeit (komprimierte Bildformate intern verwenden) oder RAM (unkomprimierte Bitmaps mit vollen 24 Bit im Speicher halten), dann wähle ich immer die Bitmapvariante, weil ich die CPU-Power dann schon noch anderweitig verbrate. :)

@Threadersteller:

Grundsätzlich:
Die verschiedenen Bildformate handhaben das Speichern der Bilddaten sehr unterschiedlich. Eine unkomprimierte Bitmap schreibt einfach für jedes Pixel das RGB-Tripel raus.
Beim PCX-Format hast du es mit einer mehr (PCX2k) oder weniger (PCX Standard) komplexen RLE-Codierung zu tun.
Ein JPEG verwendet einen ganz anderen Algorithmus um Pixel ähnlicher Färbung zusammen zu fassen.
Eine Vektorgrafik wird wieder vollkommen anders gespeichert.
Und von Layern á la Photoshop etc. sei hier mal gar nicht die Rede.
(Vergleiche auch hier.)

Prinzipiell liest du natürlich für das Bild die einzelnen Bytes von der Festplatte.
Doch was bedeutet der gelesene Wert 0xFF jetzt?
Ist das ein von Hersteller vordefinierter Wert?
Bedeutet er ein bestimmtes Codierungsformat?
Ist es evtl. die Farbtiefe des Bildes?
Oder bereits der Rot-Wert des ersten Pixels?
Genau das ist in den verschiedenen Bildformaten überall anders abgelegt. Und nicht nur mit den Farben ist das so, sondern auch mit den Bemassungen.
Ich kenne mich mit Java nicht aus, aber es klingt für mich so, als gäbe es da in den Standardbibliotheken entsprechende Filterklassen, mit denen die verschiedenen Grafikformate erkannt und dann gelesen werden können.
Unter C++ gibt es dafür dreiundrölfzig verschiedene Lösungswege. Du kannst dir entsprechende Bildfilter selbst schreiben oder vorgefertigte Bibliotheken verwenden, von denen es wieder die unterschiedlichsten gibt. Aber generell würde ich dir wirklich sehr raten, dir wenigstens zu den gängigsten Formaten (BMP, JPG, GIF, PCX) mal die Codierungsmethoden anzuschauen, sonst wirst du selbst mit einer Importbibliothek eines Drittanbieters nicht wirklich glücklich werden, da du gar nicht weisst, was du der Filterklasse jetzt aus welchen Gründen als Parameter mitgeben musst.
 
Zurück