Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi PNG Bildbereich kopieren mit JvImage (https://www.delphipraxis.net/129740-png-bildbereich-kopieren-mit-jvimage.html)

Cyberaxx 24. Feb 2009 22:18


PNG Bildbereich kopieren mit JvImage
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo

Ich hänge an dem Problem aus einem PNG Image einen Bereich zu kopieren.
BitBlt und CopyRect habe ich bereits ausprobiert komme damit aber nicht weiter.
bei BitBlt wird nichts angezeigt und bei CopyRect wird mir ein weißes Kästchen angezeigt indem
eigentlich der Bildausschnitt angezeigt werden müsste, sofern ich über ein Temporäres TBitmap gehe.

Im ersten Bild im Anhang sieht man das Quellbild. Dort sind alle Bilder untereinander vom gleichen Typ.
Die JvImage Komponente hat das normale Bild und zusätzlich Bilder für Enter und Down.
Diese würde ich jeweils gerne mit einem Ausschnitt aus dem Quellbild füllen.

Delphi-Quellcode:
  var
    TmpImage: TJvImage;
    TmpImage2: TJvImage;
    BmP: TBitmap;
begin
  Bmp := TBitmap.Create;
  Bmp.PixelFormat := pf32Bit;
  Bmp.Height := 17;
  Bmp.Width := 20;

  TmpImage := TJvImage.Create(Self);
  TmpImage.Parent := Self;
  TmpImage.Visible := True;
  TmpImage.Left := 10;
  TmpImage.Top := 10;
  TmpImage.Picture.Bitmap.Canvas.Pen.Mode := pmnotXor;

  TmpImage2 := TJvImage.Create(Self);
  TmpImage2.Parent := Self;
  TmpImage2.Top := 120;
  TmpImage2.Left := 10;
  TmpImage2.Width := 100;
  TmpImage2.Height := 100;

  Self.FMain_Normal_Frm.IMG_BACKGROUND.Picture.LoadFromFile(DefPath + 'mainframe.png');

  TmpImage.Picture.LoadFromFile(DefPath + 'captionbuttons.png');
  TmpImage.AutoSize := True;
  bmp.Canvas.CopyRect(Rect(0, 0, 20, 17), TmpImage.Picture.Bitmap.Canvas, Rect(0, 0, 20, 17));
  TmpImage2.AutoSize := True;
  TmpImage2.Picture.Bitmap.Assign(BmP);
  TmpImage2.Picture.Bitmap := Bmp;
Theoretisch sollte im zweiten Bild der Button Minimieren angezeigt werden, aber ausser einem weißen Kästchen eben nichts zu sehen.
Wenn ich es ohne temporärem TBitmap mache, so ists direkt schwarz.

Wo genau habe ich den Fehler, kann mir da jemand helfen?

Gruß

Daniel

Cyberaxx 26. Feb 2009 07:52

Re: PNG Bildbereich kopieren mit JvImage
 
Weiß echt keiner Rat?

Es muß doch möglich sein einen Bildbereich zu kopieren und als neues "Image" anzeigen.
Habe es auch mit dem TPNGObject versucht aber selbst da klappt das kopieren nicht.

himitsu 26. Feb 2009 09:08

Re: PNG Bildbereich kopieren mit JvImage
 
hast du mal versucht das ganze PNG einem TBitmap zu übergeben (Assign?) und aus diesem dann erst den Teil reuszukopieren?

Cyberaxx 26. Feb 2009 11:56

Re: PNG Bildbereich kopieren mit JvImage
 
Habe das ganze PNG einem TBitmap übergeben und dann den Ausschnitt in ein zweites TBitmap kopiere.
Jedoch wird auf dem JVImage nichts angezeigt.

Um zu testen ob in dem Bitmap überhaupt das drin ist was ich suche, habe
ich mal eine Paintbox genommen und es dort direkt auf den Canvas zeichnen lassen.
Es ist so wie ich es haben will dort. Jedoch aufs JVImage will es nicht hin.

Dazu kommt bei dem Bitmap geht die Transparenz flöten, welches aber erstmal nicht
ganz so wichtig wäre, hauptsache erstmal angezeigt bekommen.

Wenn ich das PNGObject direkt dem JvImage hinzufüge wirds komplett angezeigt.

Wenn ich versuche den bereich aus dem PNGObject in ein weiteres PNGObject kopiere
und es dann dem JvImage hinzufügen will, kommt natürlich die Fehlermeldung,
das ich nicht drauf zeichnen darf.

Getestet habe ich auch gerade folgendes:
Habe das PNGObject dem Bitmap übergeben, in einem Stream gespeichert und dann
Delphi-Quellcode:
über JvImage.Picture.Bitmap.LoadFromStream(ms);
geladen und
es wird mir bis auf die fehlende Transparents angezeigt.
Kopiere ich den Ausschnitt in ein anderes Bitmap, speicher es in einem Stream
und lade es wiederum in das JvImage mittels
Delphi-Quellcode:
JvImage.Picture.Bitmap.LoadFromStream(ms);
so wird mir dort wieder nichts angezeigt.

Delphi-Quellcode:
  MS := TMemoryStream.Create;
  TempPng := TPNGObject.Create;
  TmpPNG := TPNGObject.Create;
  bmp := TBitmap.Create;
  bmp2 := TBitmap.Create;
  Index := Self.KAZip1.Entries.IndexOf('captionbuttons.png');
  Self.KAZip1.ExtractToStream(Self.KAZip1.Entries.Items[Index], MS);

  MS.Position := 0;
  TempPng.LoadFromStream(MS);
  Self.JvImage1.Picture.Graphic := TempPng;

  BMP.Assign(TempPNG);

  Self.PaintBox1.Canvas.CopyRect(Rect(0,0,10,17), bmp.Canvas, Rect(0,0,10,17));
  bmp2.Canvas.CopyRect(Rect(0,0,10,17), bmp.Canvas, Rect(0,0,10,17));

  MS.Clear;
  MS.Position := 0;
  BMP2.SaveToStream(MS);
  MS.Position := 0;
  JvImage2.Picture.Bitmap.LoadFromStream(MS);
Die hier funktioniert ebenfalls, ich kann den Bereich ausschneiden und er wird mir
in der Painbox angezeigt.

Delphi-Quellcode:
Self.PaintBox1.Canvas.CopyRect(Rect(0,0,10,17), TempPng.Canvas, Rect(0,0,10,17));
ein Normales TImage bringt den gleichen Fehler, ich kann weder auf den Canvas etwas zeichnen, vom
Stream laden oder das Bitmap zuweisen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:40 Uhr.

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