AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi PNG Bildbereich kopieren mit JvImage
Thema durchsuchen
Ansicht
Themen-Optionen

PNG Bildbereich kopieren mit JvImage

Ein Thema von Cyberaxx · begonnen am 24. Feb 2009 · letzter Beitrag vom 26. Feb 2009
Antwort Antwort
Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#1

PNG Bildbereich kopieren mit JvImage

  Alt 24. Feb 2009, 22:18
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
Miniaturansicht angehängter Grafiken
screen2_759.jpg   screen1_112.jpg  
Daniel
Das Aufwachen aus einem boesen Traum muss einen nicht erleichtern. Es kann einen auch erst richtig gewahr werden lassen, was man Furchtbares getraeumt hat, vielleicht sogar welcher furchtbaren Wahrheit man im Traum begegnet ist!
  Mit Zitat antworten Zitat
Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#2

Re: PNG Bildbereich kopieren mit JvImage

  Alt 26. Feb 2009, 07:52
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.
Daniel
Das Aufwachen aus einem boesen Traum muss einen nicht erleichtern. Es kann einen auch erst richtig gewahr werden lassen, was man Furchtbares getraeumt hat, vielleicht sogar welcher furchtbaren Wahrheit man im Traum begegnet ist!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.157 Beiträge
 
Delphi 12 Athens
 
#3

Re: PNG Bildbereich kopieren mit JvImage

  Alt 26. Feb 2009, 09:08
hast du mal versucht das ganze PNG einem TBitmap zu übergeben (Assign?) und aus diesem dann erst den Teil reuszukopieren?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#4

Re: PNG Bildbereich kopieren mit JvImage

  Alt 26. Feb 2009, 11:56
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
ü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 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.

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.
Daniel
Das Aufwachen aus einem boesen Traum muss einen nicht erleichtern. Es kann einen auch erst richtig gewahr werden lassen, was man Furchtbares getraeumt hat, vielleicht sogar welcher furchtbaren Wahrheit man im Traum begegnet ist!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz