Frage

Ich bitte Sie freundlich mir bei diesem Problem zu helfen:

Es gibt ein Byte-Array (data: PByte), die DIB-Daten und DIBHeader:


  TDibHeader = record
    size: Cardinal;
    width: Integer;
    height: Integer;
    planes: Word;
    bits: Word;
    compression: Cardinal;
    image_size: Cardinal;
    x_res: Integer;
    y_res: Integer;
    n_colors: Cardinal;
    important_colors: Cardinal;
  end;

Wie DIB zu TBitmap konvertieren, während der CPU-Auslastung niedrig zu halten?

Ich habe versucht, http://files.codes -sources.com/fichier.aspx?id=43989&f=GdipApi.pas ohne Erfolg.

Ich habe DIB zu einem Speicher-Stream zugewiesen:


  DibMemStream.Clear;
  DibMemStream.SetSize(header.image_size);
  MoveMemory(DibMemStream.Memory,DibBuffer,header.image_size);

Ich nehme an, es sollte DIB-Header geschrieben irgendwo sein, bevor Bitmap.LoadFromMemoryStream (DibMemStream). Nicht sicher, wo.

Alle Ideen bitte?

Danke!

War es hilfreich?

Lösung

Ich habe das folgende Schema verwendet In-Memory-Bilder zu TBitmap konvertieren:

1) Fill TBMPHeader Struktur

  TBMPHeader = packed record
    bmfHeader: TBitmapFileHeader;
    bmiHeader: TBitmapInfoHeader;
    bmiColors: {depends on image format, may be absent};
  end;

2) schreiben BMPHeader + Bilddaten Memory

3) Last TBitmap von Memorystream mit TBitmap.LoadFromStream

Sie scheint bmiHeader Struktur bereits gefüllt zu haben. In bmfHeader und (vielleicht) bmiColors.

Hier ist der Code, den ich verwenden 256-Farben-Graustufen im Speicher zu konvertieren Bilder zu TBitmap (vor vielen Jahren, sorry, so dass keine Details):

procedure TksImage.CopyToBitmap(Bitmap: TBitmap);
var
  Stream: TStream;

begin
  Stream:= TMemoryStream.Create;
  try
    SaveToStream(Stream);
    Stream.Position:= 0;
    Bitmap.LoadFromStream(Stream);
  finally
    Stream.Free;
  end;
end;

procedure TksImage.SaveToStream(Stream: TStream);
type
  TBMPHeader = packed record
    bmfHeader: TBitmapFileHeader;
    bmiHeader: TBitmapInfoHeader;
    bmiColors: array[0..255] of TRGBQuad;
  end;

var
  BMPHeader: TBMPHeader;
  N: LongWord;
  I: Integer;

begin
  FillChar(BMPHeader, SizeOf(BMPHeader), 0);
  with BMPHeader.bmfHeader do begin
    bfType:= $4D42; {'BM'}
    bfOffBits:= SizeOf(BMPHeader);
    if FChannels = 4 then Dec(bfOffBits, SizeOf(BMPHeader.bmiColors));
    bfSize:= bfOffBits + LongWord(FImageSize);
  end;
  with BMPHeader.bmiHeader do begin
    biSize:= SizeOf(BMPHeader.bmiHeader);
    biWidth:= FWidth;
    biHeight:= FHeight;
    biPlanes:= 1;
    biBitCount:= 8 * FChannels;
    biCompression:= BI_RGB;
    biSizeImage:= FImageSize;
    {((((biWidth * biBitCount) + 31) and not 31) shr 3) * biHeight;}
  end;
  N:= 0;
  for I:= 0 to 255 do begin
    LongWord(bmpHeader.bmiColors[I]):= N;
    Inc(N, $010101);
  end;
  Stream.Write(BMPHeader, BMPHeader.bmfHeader.bfOffBits);
  Stream.Write(FImageData^, FImageSize);
end;

Andere Tipps

Es ist schon eine lange Zeit, da ich jede Delphi tat Codierung und ich habe nicht in der Lage gewesen, dies zu testen, aber wenn Sie einen Griff in den DIB zur Verfügung stellen können, gibt es eine Funktion - hDIBToTBitmap1 () - das sollte es tun in Link:

http://www.efg2.com/Lab/Library /Delphi/Graphics/LeadToolsConversions.TXT

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top