Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#4

AW: MemoryStream / Bitmap header

  Alt 4. Jan 2014, 04:40
Wie hast du das Bitmap denn Ohne in den Stream bekommen?


Es gibt zwei Wege, die man sich eigentlich hätte denken können,
denn wie machst du es bei einem String, wenn du am Anfang einen Char reingekommen möchtest?

Das was vorne hinzukommen soll, ist/kommt in einem neuen Stream und der andere Bitmap-Stream wird hinten angehängt (Position auf das Ende und dann die Stream-Copy-Methode benutzen)

oder

man verschiebt kopiert den Inhalt des Bitmap-Streams um die entsprechende Anzahl an Bytes nach hinten und fügt dann davor den Header ein (also die ersten Bytes überschreiben, deswegen vorher kopieren).
Ich wollte eigentlich wissen wie der Header aufgebaut ist so das ich diesen in den Stream packen kann.
Ich habe das Bitmap aber nicht den Header verstehst ?

Delphi-Quellcode:
procedure TForm1.btnCaptureClick(Sender: TObject);
var
  Background: TBitmap;
  ARect: TRect;
  i: Integer;
  Left, Top: Integer;
begin

  Background := TBitmap.Create;
  Left := 0;
  Top := 0;
  try
    Background.Height := 48;
    Background.Width := 64;
    Background.Canvas.Brush.Style := bsSolid;
    Background.Canvas.Brush.Color := clfuchsia;
    ARect := Background.Canvas.ClipRect;
    Background.Canvas.FillRect(ARect);

    for i := 1 to 64 do
    begin
      ARect.Left := Left;
      ARect.Top := 0;
      ARect.Right := 1 + Left;
      ARect.Bottom := 1;

      Background.Canvas.Brush.Color := CaptureX.pTop[I].Color;
      Background.Canvas.FillRect(ARect);

      ARect.Left := Left;
      ARect.Top := 47;
      ARect.Right := 1 + Left;
      ARect.Bottom := 48;

      Background.Canvas.Brush.Color := CaptureX.pBottom[I].Color;
      Background.Canvas.FillRect(ARect);

      inc(Left);
    end;

    for i := 1 to 48 do
    begin
      ARect.Left := 0;
      ARect.Top := Top;
      ARect.Right := 1;
      ARect.Bottom := 1 + Top;

      Background.Canvas.Brush.Color := CaptureX.pLeft[I].Color;
      Background.Canvas.FillRect(ARect);

      ARect.Left := 64;
      ARect.Top := Top;
      ARect.Right := 63;
      ARect.Bottom := 1 + Top;

      Background.Canvas.Brush.Color := CaptureX.pRight[I].Color;
      Background.Canvas.FillRect(ARect);

      inc(Top);
    end;

  finally
    CaptureX.BitmapStream := TMemoryStream.Create;
    Background.SaveToStream(CaptureX.BitmapStream);
    Background.Free;
  end;

end
bei bm.SaveToFile('C:\Test.bmp');
muss ich den Header nicht addieren das macht SaveToFile schon selbst.
Diese soll aber nicht abgespeichert werden weil sie über einen Ole-Server an eine andere Anwendung weitergeleitet wird.

function setPixelData(bitmapInfoHeader: PSafeArray; pixelData: PSafeArray): HResult; stdcall;

gruss

Geändert von EWeiss ( 4. Jan 2014 um 04:47 Uhr)
  Mit Zitat antworten Zitat