![]() |
Bitmap: falsche Farben
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo,
ich hab mit meinem ![]() Wenn ich diese Guild-Wars-Bitmaps mit einem anderen Grafikprogramm öffne werden sie auch richtig angezeigt, daher denke ich das der Fehler in meinem Programm liegt. Die Bitmaps werden in normale Images und in Image32 geladen, daher kanns imho nicht an der Image-Komponente liegen. Im Anhang mal 2 Bilder - richtig und falsch. Ich hoffe ihr könnt mir helfen. |
Re: Bitmap: falsche Farben
sieht aus als wären sie in einem Druckformat (nicht rgb).
|
Re: Bitmap: falsche Farben
Hi,
die Farben sind vertauscht (ok, dass siehst du ja). Du musst hier von deiner RGB Belegung in eine BRG Belegung umwandeln, dann sieht wieder alles richtig aus. Warum der das falsch macht weiß ich nicht. |
Re: Bitmap: falsche Farben
Zitat:
[Edit]Ich bin bis Mittwoch weg und weis nicht ob ich da Internet hab, nicht wundern wenn ich nicht gleich antworte[/Edit] |
Re: Bitmap: falsche Farben
*push*
hat keiner ne lösung? |
Re: Bitmap: falsche Farben
Kannst du das Bild von dem der Screenshot stammt mal hier anhängen? Dann würd ich mal in den Jpg-Header schauen.
|
Re: Bitmap: falsche Farben
das Original ist ein Bitmap, ich werds zuhause mal packen und hochladen
|
Re: Bitmap: falsche Farben
Liste der Anhänge anzeigen (Anzahl: 1)
So, hier ist das Originalbild, ist leider trotz Packen etwas groß.
|
Re: Bitmap: falsche Farben
Ich hab mir mal dein Bitmap angeschaut und die Header sind eigentlich korrekt und auch die Farbwerte sind richtig abgespeichert in RGB, aber Delphi beachtet offenbar nicht die bfOffBits im TBitmapFileHeader. Denn zwischen dem TBitmapInfoHeader und den Farbdaten liegen bei deinem Bitmap noch 2 leere Bytes. Diese 2 Byte liest Delphi als Farbdaten ein, wodurch der fehler entsteht.
Du hast jetzt mehrere möglichkeiten: Du schreibst dir eine eigene Prozedur zum einlesen des Bitmaps oder du änderst die Bitmaps indem du die 2 leeren Bytes entfernst bevor sie in Delphi eingelesen werden. Die 2te möglichkeit (das entfernen der leeren Bytes) habe ich mal übernommen, hier der Code:
Delphi-Quellcode:
mfg
procedure BitmapVerify(FileName: TFileName);
var fs: TFileStream; fh: TBitmapFileHeader; ih: TBitmapInfoHeader; Offset: DWORD; Buffer: Pointer; begin fs:=TFileStream.Create(FileName, fmOpenReadWrite); try fs.Position:=0; fs.ReadBuffer(fh, SizeOf(fh)); fs.ReadBuffer(ih, SizeOf(ih)); Offset:=fh.bfOffBits-(SizeOf(TBitmapFileHeader)+SizeOf(TBitmapInfoHeader)); if Offset>0 then begin GetMem(Buffer, ih.biSizeImage); try fs.Position:=fh.bfOffBits; fs.ReadBuffer(Buffer^, ih.biSizeImage); fh.bfSize:=fh.bfSize-Offset; fh.bfOffBits:=fh.bfOffBits-Offset; fs.Position:=0; fs.WriteBuffer(fh, SizeOf(fh)); fs.Position:=fh.bfOffBits; fs.WriteBuffer(Buffer^, ih.biSizeImage); fs.Size:=fh.bfSize; finally FreeMem(Buffer, ih.biSizeImage); end; end; finally fs.Free; end; end; |
Re: Bitmap: falsche Farben
Wow, vielen Dank, funktioniert super *freu* :thumb:
|
Re: Bitmap: falsche Farben
Tjo, da war jemand schneller :) Ich hatte mir schon was in der Richtung gedacht, ich hatte mal ein ähnliches Phänomen mit WAV-Files. Da war der Header nicht wie üblich 44 sondern 46 Bytes gross. Im Header stand zwar die richtige Größe, aber der WAV-Reader setzte 44 Bytes fix voraus, so dass dann die Filegröße nicht passte, da die 2 Bytes als Sample gelesen wurden, dem dann sein Pendant für den andern Kanal fehlte. Böse Falle :)
|
Re: Bitmap: falsche Farben
Ich versuch grad daraus eine Prozedur zum Einlesen der Bitmaps zu bauen, damit die Quelldateien nicht verändert werden, aber das ist doch nicht so einfach wie ich dachte. Na mal sehen :coder2:
|
Re: Bitmap: falsche Farben
OK, bin ich mal nicht so:
Delphi-Quellcode:
diese function geht nur bei 24bit Bitmaps, man kann das jedoch noch für andere Farbtiefen anpassen.
function LoadBitmap24(FileName: TFileName; var Bmp: TBitmap): Boolean;
var fs: TFileStream; fh: TBitmapFileHeader; ih: TBitmapInfoHeader; begin Result:=False; fs:=TFileStream.Create(FileName, fmOpenRead); try fs.Position:=0; fs.ReadBuffer(fh, SizeOf(fh)); fs.ReadBuffer(ih, SizeOf(ih)); if ih.biBitCount=24 then begin fs.Position:=fh.bfOffBits; Bmp.Width:=ih.biWidth; Bmp.Height:=ih.biHeight; Bmp.PixelFormat:=pf24bit; fs.ReadBuffer(Bmp.ScanLine[Bmp.Height-1]^, ih.biSizeImage); Result:=True; end; finally fs.Free; end; end; mfg |
Re: Bitmap: falsche Farben
Hallo, danke, ich hab auch was gebastelt, was auf dem ersten Code basiert, war doch einfacher als gedacht, ich hatte nur vergessen die Position des Streams auf 0 zu setzen vor dem Laden :oops:
Das sieht so aus:
Delphi-Quellcode:
Ich hab das noch nicht mit anderen Bitmaps testen können, weil ich keine Bitmaps mit weniger als 24 bit habe bei denen das Problem auftaucht.
unit BMPLaden;
interface uses Windows, Classes, SysUtils, GR32, Graphics; procedure BitmapLaden(Datei: TFileName; Bitmap: TBitmap); overload; procedure BitmapLaden(Datei: TFileName; Bitmap: TBitmap32); overload; implementation function BitmapVerify(FileName: TFileName): TMemoryStream; var fh: TBitmapFileHeader; ih: TBitmapInfoHeader; Offset: DWORD; Buffer: Pointer; begin result := TMemoryStream.Create; result.LoadFromFile(FileName); try result.Position:=0; result.ReadBuffer(fh, SizeOf(fh)); result.ReadBuffer(ih, SizeOf(ih)); Offset:=fh.bfOffBits-(SizeOf(TBitmapFileHeader)+SizeOf(TBitmapInfoHeader)); if Offset>0 then begin GetMem(Buffer, ih.biSizeImage); try result.Position:=fh.bfOffBits; result.ReadBuffer(Buffer^, ih.biSizeImage); fh.bfSize:=fh.bfSize-Offset; fh.bfOffBits:=fh.bfOffBits-Offset; result.Position:=0; result.WriteBuffer(fh, SizeOf(fh)); result.Position:=fh.bfOffBits; result.WriteBuffer(Buffer^, ih.biSizeImage); result.Size:=fh.bfSize; finally FreeMem(Buffer, ih.biSizeImage); end; end; finally result.Position := 0; //<---hatte ich vergessen^^ end; end; procedure BitmapLaden(Datei: TFileName; Bitmap: TBitmap); var BitmStream: TMemoryStream; begin BitmStream := BitmapVerify(Datei); Bitmap.LoadFromStream(BitmStream); FreeAndNil(BitmStream); end; procedure BitmapLaden(Datei: TFileName; Bitmap: TBitmap32); var BitmStream: TMemoryStream; begin BitmStream := BitmapVerify(Datei); Bitmap.LoadFromStream(BitmStream); FreeAndNil(BitmStream); end; end. Vielen Dank nochmal für deine Hilfe :thumb: |
Re: Bitmap: falsche Farben
@Sko: Ja so kann man es auch machen. Ich weiß jetzt nicht ob dir die Ladegeschwindigkeit wichtig ist? denn bei deinem code werden unnötige kopiervorgänge im speicher durchgeführt, das habe ich bei meinem code LoadBitmap24 vermieden :zwinker:
mfg |
Re: Bitmap: falsche Farben
Hmm, ich erstelle auch Thumbs damit, also wäre etwas schneller auch nicht schlecht... aber da müsste ich vor dem Laden mit deiner Funktion Herausfinden wieviel Bit das Bitmap hat, und dafür müsste ich es ja wieder in einen Stream laden um das auszulesen, bevor ich´s mit deiner Funktion laden kann, oder? :gruebel:
[Edit]und mit Bitmap32 musses auch gehen und da hab ich kein Pixelformat :gruebel: [/Edit] [Edit2]Ok, das mit den Bits hat sich erledigt, habs übersehen, das steht ja da:
Delphi-Quellcode:
[/Edit2]
if ih.biBitCount=24 then begin
... |
Re: Bitmap: falsche Farben
Für TBitmap32 könnte es so aussehen:
Delphi-Quellcode:
Habs zwar nicht getestet, aber müsste gehen.
function LoadBitmap32(FileName: TFileName; var Bmp32: TBitmap32): Boolean;
var Bmp24: TBitmap; begin Bmp24:=TBitmap.Create; try LoadBitmap24(FileName, Bmp24); Bmp32.Assign(Bmp24); finally Bmp24.Free; end; end; mfg |
Re: Bitmap: falsche Farben
Stimmt, danke, ich hab mal wieder zu kompliziert gedacht :wink:
|
Re: Bitmap: falsche Farben
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz