| Autor |
Beitrag |
MKehrer
      
Beiträge: 114
NT, 2000
D6
|
Verfasst: Do 13.03.03 11:36
Hi Delphianer,
ich möchte aus einem TPicture(z.B. emf) einen Bereich in einen TBitmap.Canvas kopieren. Das geht mit Bitmap1.Canvas.CopyRect
Allerdings muß bei CopyRect die Quelle ein TCanvas sein und so muß ich vorher das gesammte TPicture in ein Bitmap kopieren. Das braucht Zeit und außerdem lege ich die Auflösung schon fest.
Gibt´s eine Möglichkeit direkt aus einem TPicture einen Bereich in ein TBitmap zu kopieren?
Manfred
|
|
Popov
      
Beiträge: 1655
Erhaltene Danke: 13
WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
|
Verfasst: Do 13.03.03 11:58
Wieso mußt du etwas vorher kopieren? TPaintBox hat Canvas.
_________________ Popov
|
|
MKehrer 
      
Beiträge: 114
NT, 2000
D6
|
Verfasst: Do 13.03.03 12:05
Titel: ... aber die Quelle nicht
ich will ja nur einen Teil des TPictures kopieren.
wenn ich das ganze kopieren will geht´s mit Tcanvas.draw(0,0,Picture1.Graphic)
aber ich will halt einen Teil kopieren und bei CopyRect muß die Quelle ein
TCanvas sein.
Vielleicht weißt Du ja wie´s geht?
 Manfred
|
|
Popov
      
Beiträge: 1655
Erhaltene Danke: 13
WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
|
Verfasst: Do 13.03.03 13:14
Ich verstehe immer noch nicht das Problem. Ich hab dir gerade gesagt, daß TPaintBox ein Canvas hat, und die sagst mir, daß es nicht geht weil man ein Canvas braucht.
Ich gehe einfach davon aus, daß du einfach nicht weißt was du genau willst. Deshalb mache ich dir ein Beispielvorschlag und hoffe, daß du mich dann aufklärst wo du nicht durchblickst.
Quelltext 1:
| Canvas.CopyRect(Rect(0,0,100,100), PaintBox1.Canvas, Rect(0,0,100,100)); |
Der Code ist aus dem Kopf, d.h. ungeprüft
Eine Frage? Wieso benutzt du nicht TImage. Ist viel einfacher und du hast mehr Möglichkeiten.
_________________ Popov
|
|
MKehrer 
      
Beiträge: 114
NT, 2000
D6
|
Verfasst: Do 13.03.03 13:19
Titel: Wieso TPaintbox?
Ich hab ja ein nicht sichtbares TPicture von dem ich Teile in einen Canvas kopieren will.
Das TPicture hat nur einen Canvas, wenn sich dahinter ein TBitmap befindet.
 Manfred
|
|
Popov
      
Beiträge: 1655
Erhaltene Danke: 13
WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
|
Verfasst: Do 13.03.03 13:56
Also entweder blicke ich wirklich nicht durch oder wir reden aneinander vorbei.
TPaintBox.Canvas
ist eine TCanvas!
Ich hab dir gerade ein Beispiel genannt und kriege dennoch eine unverständlich Antwort zurück.
Du mußt dir im klaren sein was TCanvas ist. Es ist eine Leinwand. Da es eine Komponente ist, ist die Leinwand visuell. Wird sie nach dem zeichnen von etwas verdeckt, dann wird auch der Inhalt der Leinwand zerstört. Wenn du also eine Unsichtbare PaintBox Canvas hast, dann hast du eine leere Leinwand.
Ansonsten solltest du mir ein wenig genauer beschreiben was du mit " Das TPicture hat nur einen Canvas, wenn sich dahinter ein TBitmap befindet." meinst.
Ich versuchs noch mal:
Quelltext 1:
| PaintBox1.Canvas.CopyRect(Rect(0,0,100,100), Bitmap.Canvas, Rect(0,0,100,100)); |
Vielleicht meinst du das? Ansonsten wird es eine Ratethread.
_________________ Popov
|
|
MKehrer 
      
Beiträge: 114
NT, 2000
D6
|
Verfasst: Do 13.03.03 14:09
Also noch mal,
ich habe keine TPaintBox sondern ein TPicture
|
|
Popov
      
Beiträge: 1655
Erhaltene Danke: 13
WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
|
Verfasst: Do 13.03.03 14:35
Ok, mein Fehler. Ich entschuldige mich. Anscheinend hab ich nur auf das P geguckt.
Dann verstehe ich das Problem um so weniger, da es eigentlich kein Problem sein dürfte. TPicture ist kein Bild. Laß dich von dem Namen nicht täuschen. TPicture ist nur ein Sammelbecken für verschiedene Grafikformate. Selbst ist es kein Grafikformat. Du kannst also kein Bild in TPicture zeichnen, da es keine Leinwand hat. Wenn du also mit TPicture arbeitest, dann mußt du auch das passende Grafikformat wählen, z.B
Quelltext 1:
| TPicture.Bitmap.Canvas |
Das ist auch nicht schlecht, das ist normal. Du mußt aber auch nicht TPicture nehmen. Du kannst auch direkt mit TBitmap odes sonstigem arbeiten. Hat die Dateiendung ein Bmp am ende, dann wird das in die TBitmap des TPictures geladen.
Zwar gibt es in TPicture ein LoadFromFile, aber der läd kein Bild in TPicture, sondern in das richtigte Grafik-Objekt.
_________________ Popov
|
|
MKehrer 
      
Beiträge: 114
NT, 2000
D6
|
Verfasst: Do 13.03.03 14:45
Gut, jetzt können wir ja weitermachen.
Ich hab eben genau kein Bitmap in TPicture sondern alle möglichen Bildtypen. Sonst wärs ja einfach.
Der Vorteil von als Vektorgrafiken gekapselten Grafiken ist außerdem, dass ich ohne viel Speicher- (und Zeit-) bedarf einen Teil aus z.B. TPicture.MetaFile herauskopieren und vergrößern kann.
Wenn ich das ganze TPicture erst in ein Bitmap kopieren muß, kann ich nur vernünftig Teile rauszoomen, wenn das Bitmap riesig ist.
Manfred
|
|
Popov
      
Beiträge: 1655
Erhaltene Danke: 13
WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
|
Verfasst: Do 13.03.03 15:08
Der Vorteil von Vektorgrafiken ist mir bekannt, aber was ist jetzt die Frage?
Da du keine Bitmap hast, sondern eine Vektorgrafik, kannst du auch nicht CopyRect nutzen, da es eine Canvas Methode ist.
Du solltest dir TMetaFile und TMetaFileCanvas genauer angucken.
_________________ Popov
|
|
MKehrer 
      
Beiträge: 114
NT, 2000
D6
|
Verfasst: Do 13.03.03 15:14
OK, und jetzt lies bitte noch einmal meinen letzten Satz im ersten Posting
|
|
Popov
      
Beiträge: 1655
Erhaltene Danke: 13
WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
|
Verfasst: Do 13.03.03 15:28
| MKehrer hat folgendes geschrieben: | | OK, und jetzt lies bitte noch einmal meinen letzten Satz im ersten Posting |
Sorry, aber ich bin nicht dazu da um auf einer Seite hin und her zu scrollen. Auch lasse ich mir keine Anweisungen geben wenn ich am helfen bin. Schon garnicht, wenn einer eine Frage falsch gestellt hat und nicht bereit ist soviel Zeit zu opfern um einen neuen Satz mit der korrekten Frage zu stellen.
_________________ Popov
|
|
Simon Joker
      
Beiträge: 236
Erhaltene Danke: 1
|
Verfasst: Fr 14.03.03 13:40
Hi MKehrer
ist doch aber nicht allzu schwer.
Du musst halt Strechdraw anstatt Draw nehmen
z.B.:
Image1: ZielBild
Image2: Metafile
dbmp: Zwischenschritt für Zoom und Positionierung
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| procedure TForm1.Button1Click(Sender: TObject); var dbmp:TBitmap; DestRect:TRect; begin try dbmp:=TBitmap.Create; dbmp.Canvas.Brush.Color:=clBlack; //Hintergrund des Ausschnitts dbmp.Width:=Image1.Width-20; //kann auch andere Grösse haben als Image 1 dbmp.Height:=Image1.Height-20; // Zoomen ->Grenzen außerhalb des Bitmap DestRect.Top :=-50; DestRect.Left :=-50; DestRect.Bottom :=Image1.Height +50; DestRect.Right :=Image1.Width +50; dbmp.Canvas.StretchDraw(DestRect,Image2.Picture.Metafile); // Übernehmen -> muss ja nicht bei 10,10 sein Image1.Picture.Bitmap.Canvas.Brush.Color:=clWhite; //Hintergrund des Ziels Image1.Picture.Bitmap.Width:=Image1.Width; Image1.Picture.Bitmap.Height:=Image1.Height; Image1.Picture.Bitmap.Canvas.Draw(10,10,dbmp); finally dbmp.free; end; end; |
|
|
MKehrer 
      
Beiträge: 114
NT, 2000
D6
|
Verfasst: Fr 14.03.03 14:56
 Danke Simon, auf diese Idee bin ich gar nicht gekommen
|
|
Aya
      
Beiträge: 1964
Erhaltene Danke: 15
MacOSX 10.6.7
Xcode / C++
|
Verfasst: Fr 14.03.03 19:34
Hi,
du könntest auch einfach mit Canvas.Draw arbeiten...
wenn du z.B. den auschnitt an den Koordinaten 70,60 haben willst machste einfach:
Quelltext 1:
| Canvas.Draw(-70,-60,Picture.Graphic); |
Wenn mich net alles täuscht, ist das dann um einiges schneller als erst das komplette Bitmap zu kopieren (StretchDraw geht natürlich auch, wollte nurne Alternative sagen  )
Au'revoir,
Aya
PS: Ein Canvas welches nicht sichtbar ist, muß nicht zwingendermaßen leer sein, man kann auch auf unsichtbarem Canvas problemlos zeichnen.
_________________ Aya
I aim for my endless dreams and I know they will come true!
|
|