Autor |
Beitrag |
galagher
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Di 02.11.10 14:54
Hallo!
Ich habe folgenden Code zum Skalieren von Grafiken, so kann man aber nur von grösser auf kleiner skalieren, zB. um Thumbnails zu erhalten. Was muss ich ändern, um auch von kleiner auf grösser skalieren zu können?
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43:
| procedure TLabeledImage.ScaleImage(aWidth, aHeight: Integer); var W, H: Double; L, T: Integer; aRect: TRect; aImage: TImage; begin aImage := TImage.Create(Self);
aImage.Canvas.Brush.Color := FColor; aImage.Canvas.FloodFill(0, 0, FColor, fsBorder);
W := Picture.Width; H := Picture.Height;
while (W > aWidth) or (H > aHeight) do begin W := W / 1.01; H := H / 1.01; end;
L := aWidth+1; T := aHeight+1;
L := L mod Trunc(W) div 2; T := T mod Trunc(H) div 2;
aRect := Rect(L, T, Trunc(W)+L, Trunc(H)+T);
aImage.Canvas.CopyMode := cmSrcCopy; aImage.Canvas.StretchDraw(aRect, Picture.Graphic);
Picture := aImage.Picture;
Width := aRect.Right; Height := aRect.Bottom;
aImage.Free; end; |
Vielleicht ist die Lösung ja ganz einfach, ich weiss es wirklich nicht!
Habe auch schon gegoogelt, aber da gibt's vor allem Code zum Skalieren von Bitmaps, ich möchte aber jedes Format verarbeiten können!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Di 02.11.10 15:15
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Di 02.11.10 15:19
Und warum nimmst du den Bitmap-Code nicht? Die Lösung mit dem TImage hier ist doch noch mehr Murks, und wandelt auch alles intern in Bitmaps um. Und sowas
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| while (W > aWidth) or (H > aHeight) do begin W := W / 1.01; H := H / 1.01; end; |
Lässt sich auch direkt berechnen, da muss man sich nur mal kurz hinsetzen, etwas rechnen und ggf. ein paar Fälle unterscheiden.
Im Zweifel das "/" an der Stelle einfach durch ein "*" ersetzen, dann sollte das Bild größer werden. 
_________________ We are, we were and will not be.
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Di 02.11.10 15:54
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Di 02.11.10 17:13
Murks deswegen, weil hier eine visuelle Komponente (TImage) zur Datenverarbeitung mißbraucht wird. Das ist in etwa so, als würdest du ein unsichtbares Edit auf die Form knallen, um einen String zu speichern, oder ein TMemo, um ein paar Strings zu sortieren.
Für beliebige Formate gibt es dann TPicture bzw TGraphic - das ist das, was in TImage ja auch verwendet wird. Aber afaik hast du Bitmap-Daten im Speicher, sobald du damit arbeitest. Auf das Quellformat kommt es da nicht an. (Aber da kann ich mich auch irren)
Zu dem / bzw. *: Hast du dann auch den Schleifenkopf abgeändert? Da muss dann ja das > durch ein < ersetzt werden.
_________________ We are, we were and will not be.
|
|
platzwart
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: Di 02.11.10 17:39
Mit einer TBitmap kann man nicht nur .bmp Dateien verarbeiten, sondern auch jpeg etc... Aber diese Komponente ist nicht-visuell und somit deutlich performanter. Und bei dieser While-Schleife stellen sich einem alle Haare zu Berge, das kann man auch einfach mit einer Zeile berechnen 
_________________ Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Di 02.11.10 17:44
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Di 02.11.10 19:03
Stichwort "ScaleImage": Habe nach allen Dateien gegoogelt und erstellt - Fazit: Klappt leider nicht. Trotzdem danke!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Di 02.11.10 20:01
wieso unter Qualitätsverlust:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40:
| Procedure DrawGraphicToCanvas(Graphic:TGraphic;Canvas:TCanvas;Destrect:TRect); var x,y,x1,y1:Double; Arect:TRect; begin y:=Graphic.Height; x:=Graphic.Width; y1:=y/(Destrect.Right-Destrect.Left); x1:=x/(Destrect.Bottom-Destrect.Top); if x1<y1 then x1:=y1 ; x:=x/x1; y:=y/x1; Arect.left:=Destrect.Left+((Destrect.Right-Destrect.Left)-round(x)) div 2 ; Arect.top:=Destrect.Top+((Destrect.Bottom-Destrect.Top)-round(y)) div 2; Arect.right:=Arect.left+round(x); Arect.bottom:=Arect.top+round(y); Canvas.Fillrect(Destrect); Canvas.stretchdraw(Arect,Graphic); end;
Procedure DrawBMPToCanvas(bmp:TBitmap;Canvas:TCanvas;Destrect:TRect); var x,y,x1,y1:Double; Arect:TRect; begin y:=bmp.Height; x:=bmp.Width; y1:=y/(Destrect.Right-Destrect.Left); x1:=x/(Destrect.Bottom-Destrect.Top); if x1<y1 then x1:=y1 ; x:=x/x1; y:=y/x1; Arect.left:=Destrect.Left+((Destrect.Right-Destrect.Left)-round(x)) div 2 ; Arect.top:=Destrect.Top+((Destrect.Bottom-Destrect.Top)-round(y)) div 2; Arect.right:=Arect.left+round(x); Arect.bottom:=Arect.top+round(y); Canvas.Fillrect(Destrect); Canvas.stretchdraw(Arect,bmp); end; |
ansonsten halt ScaleImage aus meinen ersten Post
Du brauchst hierfür GDI+ von www.progdigy.com/
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Di 02.11.10 20:17
bummi hat folgendes geschrieben : | wieso unter Qualitätsverlust:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| Procedure DrawGraphicToCanvas(Graphic:TGraphic;Canvas:TCanvas;Destrect:TRect); var x,y,x1,y1:Double; Arect:TRect; begin y:=Graphic.Height; x:=Graphic.Width; y1:=y/(Destrect.Right-Destrect.Left); x1:=x/(Destrect.Bottom-Destrect.Top); if x1<y1 then x1:=y1 ; x:=x/x1; y:=y/x1; Arect.left:=Destrect.Left+((Destrect.Right-Destrect.Left)-round(x)) div 2 ; Arect.top:=Destrect.Top+((Destrect.Bottom-Destrect.Top)-round(y)) div 2; Arect.right:=Arect.left+round(x); Arect.bottom:=Arect.top+round(y); Canvas.Fillrect(Destrect); Canvas.stretchdraw(Arect,Graphic); end; | / |
Folgender Aufruf:
Delphi-Quelltext 1:
| DrawGraphicToCanvas(LabeledImage1.Picture.Graphic, LabeledImage1.Canvas, Rect(0,0,1024,768)); |
... klappt mit einem jpg nicht: "Bild kann nur geändert werden, wenn es ein Bitmap enthält."
Ich möchte, wenn möglich, nichts extra installieren, ich will doch nur ein Bild skalieren... 
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Di 02.11.10 20:32
Seltsam, ich habe es mit einem JPG getestet, geht problemlos....
hast jpeg in den uses drin??
Installieren muß Du für GDI+ nichts, einfach die 4 Dateien in einen Ordner legen der im Delphisuchpfad liegt
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Di 02.11.10 21:01
bummi hat folgendes geschrieben : | Seltsam, ich habe es mit einem JPG getestet, geht problemlos....
hast jpeg in den uses drin??Ja, habe ich.
Installieren muß Du für GDI+ nichts, einfach die 4 Dateien in einen Ordner legen der im Delphisuchpfad liegt |
Ok, habe es mir zugegebenermassen nicht näher angesehen!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Di 02.11.10 22:04
bummi hat folgendes geschrieben : | Installieren muß Du für GDI+ nichts, einfach die 4 Dateien in einen Ordner legen der im Delphisuchpfad liegt |
Habe ich jetzt gemacht und - was soll ich sagen - es funktioniert bestens!
Vielen Dank, genau, was ich brauche! 
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Do 04.11.10 11:15
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Do 04.11.10 12:33
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Do 04.11.10 18:37
Hallo!
Es funktioniert mit bmp's, aber nicht mit jpg's. Andere Formate habe ich noch nicht getestet.
Ohne die Anweisung " Image1.Picture.Bitmap := nil" bleibt das Bild in Originalgrösse erhalten, das verkleinerte Bild wird in der linken oberen Ecke "darüber"gezeichnet. Ist die Anweisung aktiv, wird gar nichts gezeichnet.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.Button1Click(Sender: TObject); var zielrect : TRect; begin zielrect := Rect(0, 0, 63, 63); MaintainAspectRatio(zielrect, Image1.Picture.Bitmap.Width, Image1.Picture.Bitmap.Height, True); Image1.Picture.Bitmap := nil;
Image1.Picture.Bitmap.Canvas.StretchDraw(zielrect, Image1.Picture.Bitmap); end; |
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Do 04.11.10 18:49
Ich hatte eigentlich von Procedure ScaleImage im Posting 3 gespreochen
und das
Delphi-Quelltext 1: 2:
| Image1.Picture.Bitmap.Canvas.StretchDraw(zielrect, Image1.Picture.Bitmap); |
kann ja nur Käse ergeben....
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Do 04.11.10 19:31
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Do 04.11.10 20:36
Also jetzt ultimativ vorgekaut und optimiert für Deine Bedürfnisse
sehr gute Skalierungsqualität
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,GDIPAPI,GDIPOBJ, StdCtrls, jpeg, ExtCtrls,ActiveX;
type TForm1 = class(TForm) Image1: TImage; Button1: TButton; Image2: TImage; procedure Button1Click(Sender: TObject); private public end; var Form1: TForm1; implementation {$R *.dfm}
Procedure ScaleImage(source:TGraphic;dest:TCanvas;DestRect:Trect;Center:Boolean=true);overload; var graphics : TGPGraphics; image: TGPImage; width, height: Integer; faktor:Double; STR : TMemoryStream; X, Y:Double; begin STR := TMemoryStream.Create; source.SaveToStream(STR); STR.Position := 0; image:= TGPImage.Create(TStreamAdapter.Create(Str)); try width := image.GetWidth; height := image.GetHeight; if ((DestRect.Right - DestRect.Left) / width) < ((DestRect.Bottom -DestRect.Top)/Height) then faktor := (DestRect.Right - DestRect.Left) / width else faktor:= ((DestRect.Bottom -DestRect.Top)/Height); Faktor := ABS(Faktor); if Center then begin X := ((Destrect.Right - Destrect.Left) - faktor * width ) / 2; Y := ((Destrect.Bottom - Destrect.Top) - faktor * Height ) / 2; end else begin X := Destrect.Left; Y := Destrect.Top;
end; graphics := TGPGraphics.Create(dest.Handle); try graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic); graphics.DrawImage( image, MakeRect(X, Y , faktor * width, faktor * height), 0, 0, width, height, UnitPixel); finally graphics.Free; end; finally STR.Free; image.Free; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin ScaleImage(image1.Picture.Graphic,Canvas,Rect(0,0,200,200)); ScaleImage(image2.Picture.Bitmap,Canvas,Rect(200,200,400,400)); end;
end. |
Zuletzt bearbeitet von bummi am Fr 05.11.10 10:00, insgesamt 2-mal bearbeitet
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Do 04.11.10 21:23
bummi hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5:
| procedure TForm1.Button1Click(Sender: TObject); begin ScaleImage(image1.Picture.Graphic,Canvas,Rect(0,0,200,200)); ScaleImage(image2.Picture.Bitmap,Canvas,Rect(200,200,400,400)); end; | |
Vielen Dank für deine Hilfe, ich verstehe nur nicht, warum das hier nicht funktioniert:
Delphi-Quelltext 1:
| ScaleImage(Image1.Picture.Graphic, Image1.Canvas, Rect(0,0,200,200)); |
Wenn ich mit 2 Images arbeite, wird nur der linke obere Ausschnitt dargestellt, der in das Rechteck passt:
Delphi-Quelltext 1:
| ScaleImage(Image1.Picture.Graphic, Image2.Canvas, Rect(0,0,200,200)); |
Ich möchte aber eigentlich nicht irgendwo auf Form1.Canvas oder in einem zweiten Image zeichnen, sondern im Quell-Image.
Sorry, aber ich hab's nicht wirklich so mit Grafik...
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
|