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
hier noch die ein-Zeilen-Variante :wink: , danke Sunlight7 :thumb:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz