![]() |
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:
Theoretisch sollte im zweiten Bild der Button Minimieren angezeigt werden, aber ausser einem weißen Kästchen eben nichts zu sehen.
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; 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 |
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. |
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?
|
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:
geladen und
über JvImage.Picture.Bitmap.LoadFromStream(ms);
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:
so wird mir dort wieder nichts angezeigt.
JvImage.Picture.Bitmap.LoadFromStream(ms);
Delphi-Quellcode:
Die hier funktioniert ebenfalls, ich kann den Bereich ausschneiden und er wird mir
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); in der Painbox angezeigt.
Delphi-Quellcode:
ein Normales TImage bringt den gleichen Fehler, ich kann weder auf den Canvas etwas zeichnen, vom
Self.PaintBox1.Canvas.CopyRect(Rect(0,0,10,17), TempPng.Canvas, Rect(0,0,10,17));
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