Entwickler-Ecke

Multimedia / Grafik - "Grafik aus einer Grafik auslesen"


cyberbug - Sa 11.10.08 02:31
Titel: "Grafik aus einer Grafik auslesen"
Hi,

ich habe folgendes Problem:
Um nicht soviele Dateien zu haben, habe ich mir überlegt, mehrere Grafiken in eine zu machen(bzw. die Grafiken "aneinanderreiehn"). Wie kann ich jetzt aber gezielt auch nur die Grafik auslesen(den Teil der grafik), die ich brauche(quasi irgendwie temporär "ausschneiden")? Ich hoffe mein Problem ist klargeworden...

MFG cyberbug


jaenicke - Sa 11.10.08 03:04

Mit BitBlt geht das zum Beispiel, da siehst du hier wie es (nach der Korrektur :D) geht:
http://www.delphipraxis.net/post790405.html

Wenn du einfach nur Grafiken mit deinem Programm mitliefern willst, dann wären Ressourcen eine gute Alternative, da dann gar keine Datei mehr neben der Exe gebraucht wird:
http://www.delphi-library.de/viewtopic.php?p=258


cyberbug - Sa 11.10.08 03:23

Danke für die Antwort!
Könntest du mir erstere Lösung bitte durch Code verdeutlichen(ich verstehe das noch nicht so ganz...)?

MFG cyberbug


jaenicke - Sa 11.10.08 03:31

http://delphi.about.com/library/bluc/text/uc052102f.htm
http://msdn.microsoft.com/en-us/library/ms532278(VS.85).aspx
Im Grunde gibst du das Handle, die Position des Zielrechtecks und dessen Größe an (bezogen auf das Zielbild), danach das Handle der Quelle sowie die Position des Quellrechtecks (bezogen auf das Quellbild).
Der letzte Parameter gibt an was bei der Operation passieren soll, bei dir sollte das SRCCOPY sein, eine Liste siehst du ja unter dem zweiten Link in der Referenz.


cyberbug - Sa 11.10.08 14:19

Danke, aber ich steh grad irgendwie auf dem Schlauch´...

Könntest du mir bitte die Funktion mit den richtigen Parametern geben, wenn ich jetzt angenommen eine datei test.jpg habe, in der zwei nebeneinanderliegende images sind(1. 32x32 2. 32x32(rechts davon)), und wenn ich zwei komponenten, Image1 und Image2 vom typ TImage habe, dass dann bild 1 in Image1 geladen wird und Bild 2 in image2?

Ich stehe wie gesagt auf dem Schlauch :cry: :( :cry: ...

MFG cyberbug


Delete - Sa 11.10.08 14:27

Du musst doch nur genau lesen, wozu die Parameter gut sind:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
BOOL BitBlt(
  HDC hdcDest, // Gerätekontext des Ziels (Canvas.Handle)
  int nXDest,  // x-Koordinate des Ziels (links)
  int nYDest,  // y-Koordinate des Ziels (oben)
  int nWidth,  // Breite des Ziels
  int nHeight, // Höhe des Ziels
  HDC hdcSrc,  // Gerätekontext der Quelle (Canvas.Handle)
  int nXSrc,   // x-Koordinate der Quelle (links)
  int nYSrc,   // y-Koordinate der Quelle (oben) 
  DWORD dwRop  // raster operation code //normalerweise SRCCOPY für exakte Kopie
);


Du gibst Breite und Höhe des Zielkontext an sowie den oberen linken Zielpunkt. Dann wird ein entsprechend großer Ausschnitt ab dem angegebenen linken oberen Punkt der Quelle ins Ziel kopiert.

Moderiert von user profile iconNarses: Quote- durch C#-Tags ersetzt


cyberbug - Sa 11.10.08 14:36

Danke für deine Bemühung, aber ich verstehe es echt nicht... Und wie benutze ich dann BitBlt mit TImage?
Könnte mir das bitte einmal jemand(anhand von sehr wenig code) verdeutlichen? Daraus würde ich dass dan wahrscheinlich verstehen...

MFG cyberbug


jaenicke - Sa 11.10.08 14:41

Probiere es doch einfach aus, zeig doch was du versucht hast. Es ist auch nicht möglich es zu verstehen, wenn du es nicht versuchst. Und wenn du es versucht hättest, dann könntest du auch den entsprechenden Code einfach mal zeigen.

Auf konkrete Fragen gibts auch konkrete Antworten:
user profile iconcyberbug hat folgendes geschrieben Zum zitierten Posting springen:
Und wie benutze ich dann BitBlt mit TImage?

Delphi-Quelltext
1:
BitBlt(Image2.Canvas.Handle, ...                    


cyberbug - Sa 11.10.08 14:56

Nun gut, danke für die Antwort. Ich habe es jetzt zumindestens ein bisschen verstanden.
ich habe folgendes geschrieben:


Delphi-Quelltext
1:
BitBlt(Image2.Canvas.Handle, Image2.Left, Image2.Top, Image2.Width, Image2.Height, Image1.Canvas.Handle, 00, SRCCOPY );                    


doch Image2 ist weiss(es soll aber der ausschnitt rein)...
Was habe ich falsch gemacht?

MFG cyberbug


Delete - Sa 11.10.08 15:03

Die Koordinaten gelten relativ zum Bitmap. So hast Du den Bereich gerade außerhalb des Bitmaps kopiert. Versuch es mal so:

Delphi-Quelltext
1:
BitBlt(Image2.Canvas.Handle, 00, Image2.Width, Image2.Height, Image1.Canvas.Handle, 00, SRCCOPY );                    


cyberbug - Sa 11.10.08 15:12

Stimmt, so funktioniert es! Danke für eure Hilfe!

MFG cyberbug

PS: Das funktioniert aber doch nur mit bitmaps oder? Gibts das auch für jpg oder png?


Delete - Sa 11.10.08 15:19

Bei einem JPEG kommst Du nicht an den Device-Kontext heran (es gibt dort keinen Canvas). Also musst Du den Umweg über Konvertierung in eine Bitmap gehen. Wie das bei PNG aussieht, weiß ich im Moment auch nicht aus dem Kopf.


jaenicke - Sa 11.10.08 15:30

Lade dir GraphicEx [http://www.soft-gems.net/index.php?option=com_content&task=view&id=13&Itemid=33] herunter, füge den Pfad zu den Dateien in den Bibliothekspfad ein und binde die Unit GraphicEx dann in deine uses ein. Dann versteht TPicture und damit TImage diese und andere Formate.


cyberbug - Sa 11.10.08 15:37

Danke^^

MFG cyberbug


Delete - Sa 11.10.08 16:00

Das hat aber mit der Ausgangsfrage herzlich wenig zu tun ;)