Autor Beitrag
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Do 04.11.10 21:45 
Ok, das Verständnisproblem liegt viel tiefer.

TImage ist eine Graphiccontrol dem etweder ein Bitmap oder ein TgraphicObjekt zugewiesen werden kann. Es mal sich dann selbst mit dem entsprechenden Objekt.
In dem Momemt in dem Du aus das Canvas zugreifen willst muß entweder ein Bitmap als Objekt vorhanden sein oder nichts (das wird dann von TImage intern erstellt).
Faktisch gemalt wird immer auf dem TBitmap des Image welches dieses dann auf seinem Canvas "malt".

Das bild wird von meiner Routine immer komplett in das gewählte Rechteck gemalt, wenn das TImage in welches Du malen möchtest kleiner ist als das Rechteck siehst Du freilich hiervon nicht alles.

Die Prozedur bekommt nur das Canvas übergeben und hat keine Ahnund davon ob Du auf eine Form, in ein TImage , auf den Drucker oder was auch immer ausgeben willst.
Die Verantwortung für die Größe des Zeichenbereiches liegt bei Dir.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Fr 05.11.10 09:29 
user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
Das bild wird von meiner Routine immer komplett in das gewählte Rechteck gemalt, wenn das TImage in welches Du malen möchtest kleiner ist als das Rechteck siehst Du freilich hiervon nicht alles.
Es ist ja aber gar nicht kleiner, sondern als Quell-Grafik grösser und soll kleiner skaliert werden, daher müsste das hier doch klappen, tut es aber nicht:
ausblenden Delphi-Quelltext
1:
ScaleImage(Image1.Picture.Graphic, Image1.Canvas,Rect(0,0,200,200));					

Ich würde das so übersetzen: "Nimm die Grafik aus Image1 und male sie skaliert auf Image1.Canvas".

Wenn du sagst:
user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
Die Prozedur bekommt nur das Canvas übergeben und hat keine Ahnund davon ob Du auf eine Form, in ein TImage , auf den Drucker oder was auch immer ausgeben willst.
Die Verantwortung für die Größe des Zeichenbereiches liegt bei Dir.
... dann müsste der obige Code doch funktionieren, oder? Denn die Prozedur weiss ja nicht, worauf gemalt werden soll. Demnach sollte sie auch auf die Canvas der Quell-Komponente malen. Macht sie aber nicht.

Der Hintergrund meiner Überlegungen ist praktischer Natur: Ich habe eine Komponente TLabeledImage, die mit meinem (langsamen) Code Grafiken skaliert. Ich suche nun eine Verbesserung. In meinem Programm werden zuerst in zur Laufzeit dynamisch erzeugten TLabeledImage's Grafikdateien geladen und dann gleich skaliert:
ausblenden Delphi-Quelltext
1:
2:
 LabeledImage1.Picture.LoadFromFile(OpenPictureDlg1.Files[i]);
 LabeledImage1.ScaleImage(77102);  //diese Parameter geben Höhe und Breite an

Naja, und das möchte ich halt schneller haben, aber eben genauso: Im selben Image skaliert malen, nicht woanders, so dass man dann auf der Programmoberfläche (genauer auf einer ScrollBox) beliebig viele (= je nachdem, wie viele Dateien man lädt) Thumbnails hat. Diese Thumbnails müssen aber Komponenten vom Typ TLabeledImage sein - eben jene, in denen die Dateien geladen wurden und deren Grafiken jetzt skaliert sind!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Fr 05.11.10 10:12 
Probiers einfach mal mit einem TBitmap,
für Scaleimage aus
rufe TImage1.invalidate aus
für nochmals Scvaleimage aus
rufe TImage1.invalidate aus

(Bild in Bild In Bild...)

Bei TGraphic geht wie gesagt gar nichts da TImage bereits mit eine TGraphicobjekt belegt ist und kein TBitmap anlegt welches für das Zeichen auf dem Canvas nötig wäre (hierbei würde ja dann auch Dein TGraphicobjekt entladen werden)

dann siehst Du was intern passiert.
Die Komponente wie Du sie bastelst kann nicht funktionieren.

Leite Deine Komponente von TGraphicControl ab
erzeige im Contructor ein TImage
füge eine Property Picture ein , reich hierbei Picture an Dein internes Image durch
Im Paint Deines GraphicControls kannst Du dann Scaleimage deines Internen TImage auf das Canvas Deinen TGraphiccontrols durchführen.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: So 07.11.10 17:41 
user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
Probiers einfach mal mit einem TBitmap,
für Scaleimage aus
rufe TImage1.invalidate aus
für nochmals Scvaleimage aus
rufe TImage1.invalidate aus

(Bild in Bild In Bild...)
Ja:
ausblenden Delphi-Quelltext
1:
2:
 ScaleImage(
  image1.Picture.Graphic, image1.Canvas, rect(00200200));
...Bild in Bild in Bild - genau das möchte ich aber nicht, ich möchte in jenem Image skalieren, das die Ursprungsgrafik enthält, ohne das das Originalbild sochtbar bleibt!

Ausserdem funktioniert der Code nicht, wenn die Ursprungsgrafik kein Bitmap ist: "Bild kann nur geändert werden, wenn es ein Bitmap enthält."

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
Bei TGraphic geht wie gesagt gar nichts da TImage bereits mit eine TGraphicobjekt belegt ist und kein TBitmap anlegt welches für das Zeichen auf dem Canvas nötig wäre (hierbei würde ja dann auch Dein TGraphicobjekt entladen werden)
Das verstehe ich nun überhaupt nicht! :nixweiss:

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
Die Komponente wie Du sie bastelst kann nicht funktionieren.
Sie funktioniert, und zwar mit jedem Grafikformat und kann grösser und kleiner skalieren, aber der Code ist langsamer. Ich komme aber auf keine effizientere Formel zum Skalieren als die while-Schleifen mit den Divisionen.

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
Leite Deine Komponente von TGraphicControl ab
erzeige im Contructor ein TImage
füge eine Property Picture ein , reich hierbei Picture an Dein internes Image durch
Im Paint Deines GraphicControls kannst Du dann Scaleimage deines Internen TImage auf das Canvas Deinen TGraphiccontrols durchführen.
Das ist mir jetzt aber auch zuviel Aufwand!

Vielen Dank für deine Hilfe, aber wenn dein Code wirklich auf das Bitmap-Format beschränkt ist, ist er doch nur sehr begrenzt nutzbar! Ich glaube aber, dass das doch nicht sein kann, und dass ich da sicher etwas nicht verstehe.

Ich suche einfach eine bessere, schnellere Formel für das hier:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
//...
 while (W > aWidth) or (H > aHeight) do
  begin
   W := W / 1.01;
   H := H / 1.01;
  end
else
  while (W < aWidth) or (H < aHeight) do
  begin
   W := W * 1.01;
   H := H * 1.01;
  end;

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!