Einzelnen Beitrag anzeigen

Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#1

Gdi+: Wie Bitmap-Objekt mit Image-Bild verbinden?

  Alt 22. Mai 2011, 20:27
Hallo Gemeinde!

Schon wieder ich -- aber ich bin mal wieder im GDI+ Gestrüpp hängengeblieben und hoffe wieder auf eure Hilfe.
In einem TImage habe ich ein Bild von dem ich gern ein Farb-Histogramm (RGB Kanäle) erstellen möchte. Erik van Bilsen hat in seinem GDI+ 1.1 Demo-Programm sogar ein solches Beispiel (s.u.). Dieses Beispiel geht nun davon aus, dass man ein Bitmap-Objekt mit "Bitmap := TGPBitmap.Create('ImageFileSmall.jpg')" erzeugt indem man das File als Parameter übergibt. Und genau hier ist mein Problem: Wie geh ich vor, wenn ich das Bildchen bereits in einer TImage-Komponente habe -- es also zur Laufzeit erzeugt habe, und deshalb kein File als Parameter übergeben kann?
Wie kann ich mein bereits bestehendes Image mit Bitmap vom Typ IGPBitmap verheiraten?
Hier das angesprochene Beispiel -- eigentlich geht es nur um die erste Zeile nach dem Begin:
Delphi-Quellcode:
procedure TDemoHistogram.Run;
var
  Bitmap: IGPBitmap;
  Histogram: IGPHistogram;
  I, J, X, Y, MaxVal: Integer;
  Scale: Double;
  Pen: IGPPen;
begin
  
  Bitmap := TGPBitmap.Create('ImageFileSmall.jpg'); // <-- Hier drum geht es !
  
  Graphics.DrawImage(Bitmap, 10, 10, Bitmap.Width, Bitmap.Height);

  // Retrieve RGB histogram of bitmap
  Histogram := Bitmap.GetHistogram(HistogramFormatRGB);

  // Determine the maximum value in the histogram
  MaxVal := 0;
  for J := 0 to Histogram.ChannelCount - 1 do
    for I := 0 to Histogram.EntryCount - 1 do
      MaxVal := Max(MaxVal, Histogram[J, I]);

  // Scale maximum value so it displays as the height of the bitmap
  Scale := Bitmap.Height / MaxVal;

  // Draw the histogram next to the bitmap
  Pen := TGPPen.Create(0);
  X := 10 + Bitmap.Width + 10;
  Y := 10 + Bitmap.Height;
  for I := 0 to Histogram.ChannelCount - 1 do
  begin
    if (I = 0) then
      Pen.Color := TGPColor.Create(128, 255, 0, 0)
    else if (I = 1) then
      Pen.Color := TGPColor.Create(128, 0, 255, 0)
    else
      Pen.Color := TGPColor.Create(128, 0, 0, 255);

    for J := 0 to Histogram.EntryCount - 1 do
      Graphics.DrawLine(Pen, X + J, Y, X + J, Y - Scale * Histogram[I, J]);
  end;
end;
Habt ihr wohl eine Idee für mich?

Dankeschön & Gruß
Jazzman
--- Delphi XE Starter, Windows 8 ---
  Mit Zitat antworten Zitat