Unterschied von BMP und Jpg nach dem Laden

CodeFatal

Erfahrenes Mitglied
Moin moin,

ich arbeite momentan an einer Funktion die Bitmaps auf dem Monitor darstellt. Diese Funktion kann bereits Bmp und Jpg laden und auf dem Bildschirm darstellen.
Weiterhin berarbeite ich die Bilder etwas. Zoom, 24 bit Alphablending, Transparente Farbe.
Um die Funktion zu testen, hab ich ein bmp erstellt und das ebenfalls im jpg-Format abgespeichert. Unterschiede der Grafiken durch die Komprimierung sollen mal vernachlässigt werden.
Beim Testen ist mir dann aufgefallen, das die beiden Bilder unterschiedlich behandelt werden.
Bis jetzt bin ich davon ausgegangen, das die Grafik-Informationen gleich im Speicher abgelegt werden als DIB. Unterlieg ich da einem Irrglauben?

Gruss Michael
 
Hmm, das kommt dann darauf an, wo und wie du die Grafiken im Speicher behältst. Bei HBITMAP gibt es glaube tatsächlich so etwas wie ein Jpeg-Format.

Wenn du natürlich CreateDIBSection oder Ähnliches benutzt, gibst du ja das Format vor, da sollte dann kein Unterschied sein.
 
Stell die beiden Bilder neben einander dar.

Beide Bilder werden auch mit dem obrigen Code geladen.
Da ich dann ein HBITMAP zur Verfügung hab, Dachte ich wären die beiden Daten gleichwertig (Jpg.Bild hat leichte Abweichungen wegen der Kompression). Zumal nur nen Bitmap Stream geladen werden kann.

verändere ich nun die beiden Datensätze, so verhalten sie sich unterschiedlich.
Vielleicht mal folgendes Fragment aus der OnPaint():
Code:
	CDC dcsrc;//Source Fläche - Daten wie im Image
	CBitmap bmpsrc;
	CBitmap *oldbmpsrc;
	dcsrc.CreateCompatibleDC(pDC);//fläche erstellen
	bmpsrc.CreateCompatibleBitmap(pDC,r.Width(),r.Height());//Bild erstellen in Grösse von Zielfläche
	oldbmpsrc = dcsrc.SelectObject(&bmpsrc);//Bitmap auswählen

	CDC dcmsk;//monochrome Masken Fläche - Schwarz Weiß Abdruck
	CBitmap bmpmsk;
	CBitmap *oldbmpmsk;
	dcmsk.CreateCompatibleDC(pDC);//fläche erstellen
	bmpmsk.CreateBitmap(r.Width(),r.Height(), 1, 1, NULL);//Bild erstellen in Grösse von Zielfläche
	oldbmpmsk = dcmsk.SelectObject(&bmpmsk);//Bitmap auswählen

	//Vorbereitung
	CDC dcsrcorig;//Source Fläche - Daten wie im Image
	CBitmap *oldbmpsrcorig;
	dcsrcorig.CreateCompatibleDC(pDC);//fläche erstellen

	HBITMAP pImage = (HBITMAP)Map->GetImage();
	CBitmap *bmpsrcorig = CBitmap::FromHandle((HBITMAP)pImage);
	oldbmpsrcorig = dcsrcorig.SelectObject(bmpsrcorig);//Bitmap auswählen

	//Zeichnen in Zwischen Ziel
	dcsrc.StretchBlt(r.left,r.top,r.Width(),r.Height(),&dcsrcorig,Source->left,Source->top,Source->Width(),Source->Height(),SRCCOPY);
	//aufräumen von zwischen Ziel
	dcsrcorig.SelectObject(oldbmpsrcorig);
	//Vorbereitung für Berechnung
	dcsrc.SetBkColor(Color);
	// geladene Bitmap in monochrome Bitmap umkopieren
	// -> alles ausser Alphafarbe erscheint nun in schwarzer Farbe
	dcmsk.BitBlt(0,0,r.Width(),r.Height(),&dcsrc,0,0, SRCCOPY );
	//Schwarz weiss Maske alles in Hintergrund farbe soll weiss sein alles andere schwarz
	pDC->BitBlt(Dest->left,Dest->top,Dest->Width(),Dest->Height(),&dcmsk,0,0,SRCCOPY);
	return;

Musste das etwas zusammen streichen, falls da jetzt nen kleiner Syntax-Fehler drin steckt->Bitte ignorieren;-)
:Edit
Der Code Funktioniert bei BMP so wie ersoll bei JPG nur bei Color(Transparente Farbe) == 0x00000000 bzw 0x00ffffff Bei allen anderen geht es schief.
Es soll übrigens nur die Schwarzweiss maske der Grafik dargestellt werden. Weiss ist dann alles was der Transparenten Farbe entspricht und Schwarz alles was anderes ist.
 
Zuletzt bearbeitet:
Ich glaub ich hab meinen Fehler gefunden :)
Beim erstellen des Bmp-Bildes hab ich Farben wie 0x00ff0000 oder 0x00ffff00 verwendet. die Jpg Komprimierung hat das dann zu 0x00ff0001 oder änlich gemacht :mad:
Kleiner Fehler grosse Wirkung

gibt es vielleicht die Möglichkeit die Grafiken so zu bearbeiten, das die Farben beibehalten werden:confused:
Hab zwar mal was von Webfarben gehört aber was genau damit ist?

Erstellt hab ich die Bilder mit Photoshop 7.0
 
Zuletzt bearbeitet:
Schon möglich, das die DIBs unterschiedliche Parameter haben. Hole doch mal mit GetDIBBits() die Bitmap-Daten und vergleiche die Einträge bei der BITMAPINFOHEADER-Struktur.
 
Schein wohl doch richtig gecodet zuhaben:) hab gerade mal mein Ergebnis mit IrfanView und Photoshop verglichen (Bildschirmfoto).
Demnach sieht es so aus, als ob Photoshop da irgendwie noch was reinrechnet hat auf jeden Fall nen anderes Ergebnis... IrfanView liefert aufjedenFall das selbe Resultat wie meine Software...
Auch wenn die Frage besser in den Photoshop bereich passt:
Kann man irgendwie jpg lossless speichern?
Oben genutzte Laderoutine ist nur temporär arbeite später mit IImage auf nem CE System und da kann ich nur Jpg und Bmp laden und hab auch noch wenig speicherplatz zur Verfügung.
 
Zurück