Autor |
Beitrag |
wulfskin
      
Beiträge: 1349
Erhaltene Danke: 1
Win XP
D5 Pers (SSL), D2005 Pro, C, C#
|
Verfasst: Di 14.11.06 19:58
Bitte????
Der Code arbeitet mit allen Formaten die Delphi unterstützt, da du diese ja auch in Bitmap umwandeln können musst. Viele weitere findest du mit der Gaphic Lib (o.ä.) von Mike Lischke (soft-gems.net).
Gruß Hape!
_________________ Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Di 14.11.06 20:17
wulfskin hat folgendes geschrieben: | Bitte????
Der Code arbeitet mit allen Formaten die Delphi unterstützt, da du diese ja auch in Bitmap umwandeln können musst. |
[Naiv on]: Stretchbitmap(ImagePlus1.Picture.Bitmap, 69, ImagePlus2.Picture.Bitmap); [Naiv off]
-> "Systemresourcen erschöpft".
Sorry, ich bin kein Grafikfreak; meine Frage war aber eigentlich (und ich will jetzt gar nicht noch nach weiteren Features von Mike Lischke googlen), was ist falsch an meinem Code? Dass das Prinzip richtig ist, denke ich ja schon, und ohne den entscheidenden Hinweis von jaenicke: ...
jaenicke hat folgendes geschrieben: | Zum Thema: Die Quelltexte funktionieren alle, du machst nur einen Denkfehler! Du hast ja gar kein quadratisches Bild. Wenn du deses aber auf 69 mal 69 Pixel in ein quadratisches Format bringst (egal mit welchem der Quelltxte), dann ist es natürlich verzerrt.
Du musst das Seitenverhältnis beibehalten...
Beispiel:
Du hast ein Bild mit einr Größe von 690 mal 345 Pixeln. Dieses willst du ja nicht auf 69 mal 69, sondern auf 69 mal 34,5 Pixel, nur um 34,5 / 2, also um 17,25 Pixel nach unten versetzt haben (natürlich dann gerundet).
Schließlich sind im Originalbild doch keine Streifen oben und unten mit drin...
Auf die Zielhöhe von 34,5 kommst du mit 69 * 345 / 690. Davon nochmal die Hälfte muss das Bild nach unten verschoben werden. Um einen Integer-Wert zu erhalten kannst du auch statt dem / direkt ein div benutzen. |
... wäre ich wohl kaum soweit gekommen - an dieser Stelle schon mal vielen Dank!
Doch ich möchte gerne bei meinem, von jaenicke "inspiriertem" Code bleiben, aber er ist eben fehlerhaft. Trotzdem danke auch an wulfskin!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 14.11.06 22:26
Noch was zu den Problemen, die du noch hast:
Die weißen Streifen komme daher, dass du (wen ich das jetzt richtig sehe) in eine 69 mal 69 Bitmap das skalierte Bild schrebst und diese dann irgendwo einfügst. Was du eigentlich machen musst (ich dachte das würdest du dann selbst machen  ): Das Bild in diese Btmap ganz oben einfügen, die Höhe dieser Bitmap aber auf die korrekte Höhe setzen. Wenn du dann diese Bitmap wo einfügst, dann muss diese eben entsprechend weiter unten gezeichnet werden.
Da du die Bilder ja wohl abspeichern willst (kannst du ja ganz einfach in einem Stream machen, damit nur eine Datei ist...), müsstest du die halt skaliert speichern, in meinem Beispiel also in 69 mal 35. Dann müsstes du bei der Einblendung in eine andere Bitmap die Position um die Hälfte von (69 - Höhe des kleinen Bildes) nach unten setzen.
Was die Verzerrung angeht:
Ich vermute mal, das liegt am Runden der Höhe... Wenn die Verzerrung doch stärker ist, weiß ich jetzt nicht warum.
Dann poste doch mal ein Projekt, in dem ich das ausprobieren kann. (Oder schicks mir per ICQ oder E-Mail) Ich hab nämlich keine Lust, extra ein Testprojekt selbst zu schreiben...
Und ein Beispielbild, was da verzerrt wird, bräuchte ich auch.
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Di 14.11.06 22:51
jaenicke hat folgendes geschrieben: | Die weißen Streifen komme daher, dass du (wen ich das jetzt richtig sehe) in eine 69 mal 69 Bitmap das skalierte Bild schrebst und diese dann irgendwo einfügst. |
Position 0, 0, X, Y, wobei ich X und Y mit deinem Code berechne. Die weissen Streifen übermale ich vorher einfach ganz brutal mit Floodfill.
jaenicke hat folgendes geschrieben: | Was du eigentlich machen musst (ich dachte das würdest du dann selbst machen ): Das Bild in diese Btmap ganz oben einfügen, die Höhe dieser Bitmap aber auf die korrekte Höhe setzen. Wenn du dann diese Bitmap wo einfügst, dann muss diese eben entsprechend weiter unten gezeichnet werden. |
Also, das verstehe ich nun gar nicht... was ist die korrekte Höhe? Die des Originals? Und wie weiter unten zeichnen?
jaenicke hat folgendes geschrieben: | Da du die Bilder ja wohl abspeichern willst (kannst du ja ganz einfach in einem Stream machen, damit nur eine Datei ist...) |
Darauf komme ich später eventuell zurück! Ich weiss noch nicht, wie ich das genau machen werde.
jaenicke hat folgendes geschrieben: | Dann poste doch mal ein Projekt, in dem ich das ausprobieren kann. |
Hier - und danke schon mal!
Einloggen, um Attachments anzusehen!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
DaKirsche
      
Beiträge: 187
Win XP Pro, SuSe Linux 7.3 - 10.2, Win 2k3 Server, Win 2000, Win NT 4.0
Delphi 2006 Pro, Java, HTML, SQL, PHP, CSS
|
Verfasst: Mi 15.11.06 00:06
Naja, ich würde es eigentlich mal mit diesem Ansatz versuchen:
1. Bild in Miniatur laden
2. Thumbnail auf TBitMap prüfen
3. ggf. umwandeln
Danach in ein 69x69 Pixel großes, weiteres Image Jedes Pixel des Thumbs mit
Delphi-Quelltext 1: 2: 3:
| For (x:= 0 to ImageThumbFrom.width) do For For (y:= 0 to ImageThumbFrom.height) do ImageThumbToSave.Canvas.pixels[x,y] := ImageThumbFrom.Canvas.Pixels[x,y] |
versuchen.
Ist zwar umständlich, aber sollte gehen.
Damit nimmst du von jedem Pixel des Images, in dem die Miniatur liegt die Farbe und setzt diese Farbe am entsprechenden Pixel des neuen Images. Dieses Imgae ist 69x69 Pixel groß und kann dann auch so gespeichert werden. Natürlich ggf. vorher konvertiert in .JPEG oder .GIF.
ImageThumbToSave muss nicht unbedingt visible sein...kann also im Hintergrund ablaufen.
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mi 15.11.06 19:31
DaKirsche hat folgendes geschrieben: | Damit nimmst du von jedem Pixel des Images, in dem die Miniatur liegt die Farbe und setzt diese Farbe am entsprechenden Pixel des neuen Images. Dieses Imgae ist 69x69 Pixel groß und kann dann auch so gespeichert werden. |
Damit kopieren ich das Bild 1:1 - Canvas "hat die Originalgrösse" des Bildes, dieses wird nur verkleinert dargestellt. Ich brauche ganz einfach eine Möglichkeit, die Ausmasse der Verkleinerung festzustellen.
Ich hatte aber einen hellen Moment  und habe Folgendes erdacht:
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:
| var X, Y: Double; MyRect: TRect; begin ImagePlus2.Canvas.Brush.Color := clBtnFace; ImagePlus2.Canvas.FloodFill(0, 0, clBtnFace, fsBorder);
X := ImagePlus1.Picture.Width; Y := ImagePlus1.Picture.Height;
while (X > 69) or (Y > 69) do begin X := X / 1.0001; Y := Y / 1.0001; end;
MyRect := Rect(0, 0, Trunc(X), Trunc(Y));
ImagePlus2.Canvas.CopyMode := cmSrcCopy; ImagePlus2.Canvas.StretchDraw(MyRect, ImagePlus1.Picture.Graphic);
ImagePlus2.Picture.SaveToFile('d:\delphi6\projects\1.bmp');
LoadBitmapsFromFile('d:\delphi6\projects\1.bmp', ImageList1, 19098);
ImagePlus2.Picture.Bitmap.Width := Trunc(X); ImagePlus2.Picture.Bitmap.Height := Trunc(Y); end; |
So, und in irgendeiner .ini speichere ich dann die Werte von Trunc(X) und Trunc(Y), damit ich beim Einlesen der Thumbnails diese wieder in der Mitte ausgerichtet anzeigen kann, sonst sind die Bilder links und oben - der Rest ist ja mit FloodFill ausgemalt.
Am Besten wäre natürlich, anstatt zuerst in eine Datei zu speichern, in einen Stream zu schreiben. Ich weiss aber nicht, wie ich das anstellen soll, dass das Einlesen in ImageList1 aus einem Stream anstatt aus einer Datei klappt.
Für Verbesserungsvorschläge bin ich euch jedenfalls dankbar!
_________________ 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: Mi 15.11.06 22:56
Habe die Lösung gefunden - das Ergebnis ist absolut akzeptabel, minimale Abweichungen (1-2 Pixel) ergeben sich wohl durch die Rundungen auf Ganzzahlen:
Delphi-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: 25: 26: 27: 28: 29: 30:
| var X, Y: Double; L, T: Integer; MyRect: TRect; begin DestImagePlus.Canvas.Brush.Color := clBtnFace; DestImagePlus.Canvas.FloodFill(0, 0, clBtnFace, fsBorder);
X := SourceImagePlus.Picture.Width; Y := SourceImagePlus.Picture.Height;
while (X > 69) or (Y > 69) do begin X := X / 1.0001; Y := Y / 1.0001; end;
L := 69 mod Trunc(X) div 2; T := 69 mod Trunc(Y) div 2;
MyRect := Rect(L, T, Trunc(X)+L, Trunc(Y)+T);
DestImagePlus.Canvas.CopyMode := cmSrcCopy; DestImagePlus.Canvas.StretchDraw(MyRect, SourceImagePlus.Picture.Graphic);
DestImagePlus.Picture.SaveToFile('d:\delphi6\projects\1.bmp');
LoadBitmapsFromFile('d:\delphi6\projects\1.bmp', ImageList1, FileSizeByname('d:\delphi6\projects\1.bmp')); end; |
Geht vielleicht einfacher oder schneller, speziell die Divisionen mit 1.0001 gefallen mir nicht. Ich denke halt, mit so kleinen Werten erreiche ich eine höhere Genauigkeit.
Das alles muss noch ausgefeilt werden, aber ich glaube, so geht's! Danke an alle, die mir mit ihren Tipps geholfen haben - oft ist es nicht der Code, den man erhält, sondern die Gedankenanstösse, die einem weiterhelfen! Ich gebe aber zu, dass ich 69 mod Trunc(X) div 2 einfach mal so ausprobiert habe - also eher ein Zufallstreffer!
Es wäre dennoch eventuell eleganter, mit einem Stream zu arbeiten, vielleicht aber brauche ich doch eine Datei dazu, mal sehen.
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
wulfskin
      
Beiträge: 1349
Erhaltene Danke: 1
Win XP
D5 Pers (SSL), D2005 Pro, C, C#
|
Verfasst: Mi 15.11.06 23:29
Du bist witzig, StretchDraw hab ich dir schon ein paar Zeilen darüber vorgestellt...
So geht es halt, wann man steif an seiner Lösung festhielt, die erstens sehr langsam wäre und zweitens wohl nicht funktioniert hätte, da ein Image wohl nur zur Anzeige das Bild skaliert, intern aber die Orginalgröße behält.
Gruß Hape!
_________________ Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Do 16.11.06 18:02
wulfskin hat folgendes geschrieben: | Du bist witzig, StretchDraw hab ich dir schon ein paar Zeilen darüber vorgestellt... |
Du hast aber "StretchRect" geschrieben; StrechDraw habe ich schon in meinem 1. Post benutzt!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
wulfskin
      
Beiträge: 1349
Erhaltene Danke: 1
Win XP
D5 Pers (SSL), D2005 Pro, C, C#
|
Verfasst: Do 16.11.06 18:06
galagher hat folgendes geschrieben: | Du hast aber "StretchRect" geschrieben; StrechDraw habe ich schon in meinem 1. Post benutzt! |
Siehe Quelltext...
_________________ Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Do 16.11.06 22:30
wulfskin hat folgendes geschrieben: | Siehe Quelltext... |
Wer lesen kann ist klar im Vorteil! 
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
|