Delphi-PRAXiS
Seite 2 von 2     12

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bitmap: falsche Farben (https://www.delphipraxis.net/81014-bitmap-falsche-farben.html)

OldGrumpy 21. Nov 2006 23:02

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 :)

Sko 21. Nov 2006 23:36

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:

Phantom1 22. Nov 2006 09:05

Re: Bitmap: falsche Farben
 
OK, bin ich mal nicht so:

Delphi-Quellcode:
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;
diese function geht nur bei 24bit Bitmaps, man kann das jedoch noch für andere Farbtiefen anpassen.

mfg

Sko 22. Nov 2006 10:50

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:
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.
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.

Vielen Dank nochmal für deine Hilfe :thumb:

Phantom1 22. Nov 2006 11:37

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

Sko 22. Nov 2006 12:13

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:
if ih.biBitCount=24 then begin
...
[/Edit2]

Phantom1 22. Nov 2006 13:09

Re: Bitmap: falsche Farben
 
Für TBitmap32 könnte es so aussehen:
Delphi-Quellcode:
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;
Habs zwar nicht getestet, aber müsste gehen.

mfg

Sko 22. Nov 2006 13:43

Re: Bitmap: falsche Farben
 
Stimmt, danke, ich hab mal wieder zu kompliziert gedacht :wink:

Sko 3. Dez 2006 13:00

Re: Bitmap: falsche Farben
 
hier noch die ein-Zeilen-Variante :wink: , danke Sunlight7 :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:37 Uhr.
Seite 2 von 2     12

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf