Autor |
Beitrag |
galagher
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mo 13.11.06 18:40
Hallo!
Ich möchte ein - sagen wir mal ganz unprofessionell - Bild von einem Image in ein anderes zeichnen, aber ohne dabei die tatsächliche Grösse in Pixeln zu zeichnen, sondern nur die dargestellte Miniatur so wie sie ist. Das Beipielbild zeigt den Design-Zeitpunkt. Es soll das Bild, so wie es dargestellt ist, in ein anderes Image gezeichnet werden. Das Original-Bitmap ist viel grösser, ich will aber nur die Miniatur zeichnen.
Alle meine Versuche ergaben, dass das Bild in Originalgrösse gezeichnet wird. Ich will aber ein Bild, das genauso klein ist wie die Miniatur, das heisst, wenn ich es speichere, habe ich ein so kleines Bild gespeichert! Dabei ist es wichtig, dass die "leeren" Bereiche oben und unten mitgezeichnet werden - 69x69 Pixel.
Ich habe Folgendes ohne Erfolg gamacht:
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:
| var MyRect, MyOther: TRect; X, Y: Integer; aColor: TColor; begin for X := 0 to 69 do for Y := 0 to 69 do begin aColor := ImagePlus1.Picture.Bitmap.Canvas.Pixels[X, Y]; ImagePlus2.Canvas.Pixels[X, Y] := aColor; end;
exit;
MyRect := Rect(0, 0, 69, 69);
ImagePlus2.Canvas.CopyMode := cmSrcCopy; ImagePlus2.Canvas.StretchDraw(MyRect, ImagePlus2.Picture.Graphic); end; |
Es sollte auch mit .jpg und .gif klappen! Ist einer von euch ein Grafik-Spezialist, der das kann?
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!
|
|
Marco D.
      
Beiträge: 2750
Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
|
Verfasst: Mo 13.11.06 18:52
Liegt das Bild als TBitmap vor?
_________________ Pascal keeps your hand tied. C gives you enough rope to hang yourself. C++ gives you enough rope to shoot yourself in the foot
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mo 13.11.06 19:08
Marco D. hat folgendes geschrieben: | Liegt das Bild als TBitmap vor? |
Kann auch ein Jpg oder Gif sein.
Habe jetzt das hier versucht, aber ...
Delphi-Quelltext 1: 2: 3:
| MyRect := Rect(0, 0, ImagePlus1.Picture.Width, ImagePlus1.Picture.Height); MyOther := Rect(0, 0, 69, 69); ImagePlus2.Canvas.CopyRect(MyOther,ImagePlus1.Picture.Bitmap.Canvas,MyRect); |
... das verzerrt das Ergebnis:
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!
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Mo 13.11.06 19:13
schaut mir eher nach falschem pixelformat aus aber ich bin auch nicht dere ultimative grafik experte!
lg el
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mo 13.11.06 19:36
Ich will doch nur was ich sehe - nur das und in genau der Grösse, in der ich es sehe (69x69) - anderswo genauso zeichnen, und es gelingt mir nicht! 
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 13.11.06 19:44
Moin!
Schau mal nach sowas: BITMAP SKALIEREN
Vielleicht kommst du damit weiter.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mo 13.11.06 20:09
Leider nicht, da ist was dabei, das zwar klappt, aber es kopiert das Bild, und das ist gleich dem Originalbild. Hier der Code:
Delphi-Quelltext 1: 2:
| ImagePlus2.Picture.Bitmap := ImagePlus1.Picture.Bitmap; ImagePlus2.Picture.Bitmap.Canvas.FillRect(Rect(0,0,69,69)); |
Die Proportionen passen ja, aber wenn man das speichert, erhält man eine Dateigrösse, die dem Original gleicht.
_________________ 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: Mo 13.11.06 20:34
Das darf doch nicht wahr sein - wieder einen Code gefunden, der das Ergebnis verzerrt bzw, nur einen Ausschnitt darstellt:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.ResizeImage(newWidth,newHeight: Integer); begin SetStretchBltMode(ImagePlus2.Canvas.Handle, Halftone); StretchBlt(ImagePlus2.Canvas.Handle, 0,0,newwidth,newheight, ImagePlus1.Canvas.Handle,0,0, ImagePlus1.Width,ImagePlus1.Height,SRCCOPY); end; |
Gefunden hier: www.delphipraxis.net/post151.html
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Mo 13.11.06 21:54
das interessiert mich jetzt aber auch! Ich mach mich mal auf die suche nach Codes!
mfg el
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 13.11.06 22:23
elundril hat folgendes geschrieben: | schaut mir eher nach falschem pixelformat aus aber ich bin auch nicht dere ultimative grafik experte! |
Merkt man gar nicht
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.
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mo 13.11.06 22:44
jaenicke hat folgendes geschrieben: | 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... |
Zum Speichern sollten alle Miniaturen exakt die selbe Anzahl an Bytes haben. Aber erstmal will ich es hinkriegen, dass die Proportionen stimmen.
jaenicke hat folgendes geschrieben: | 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. |
Aber wie erhalte ich nun die korrekten Werte?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| var Y: Integer; MyRect: TRect; begin Y := 69 * ImagePlus1.Picture.Height div ImagePlus1.Picture.Width;
MyRect := Rect(0, 0, ImagePlus1.Picture.Width, Y);
ImagePlus2.Canvas.CopyMode := cmSrcCopy; ImagePlus2.Canvas.StretchDraw(MyRect, ImagePlus1.Picture.Graphic); end; |
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 13.11.06 22:50
Ich würde mal vermuten, dass jetzt das Seitenverhältnis stimmt, nur dass das Bild ganz oben im zweiten hängt, oder? Wen nicht, hättest du mal dazusagen müssen, was bei rauskommt.
Jedenfalls vermute ich nur, dass du das Zielrechteck nur noch statt bei (0, 0) bei (0, y div 2) anfangen lassen musst.
jaenicke hat folgendes geschrieben: | Davon nochmal die Hälfte muss das Bild nach unten verschoben werden. |
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mo 13.11.06 22:52
Funktioniert prinzipiell, aber verzerrt immer noch etwas:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| var X, Y: Integer; MyRect: TRect; begin X := 69 * ImagePlus1.Picture.Width div ImagePlus1.Picture.Height; Y := 69 * ImagePlus1.Picture.Height div ImagePlus1.Picture.Width;
MyRect := Rect(0, 0, X, Y);
ImagePlus2.Canvas.CopyMode := cmSrcCopy; ImagePlus2.Canvas.StretchDraw(MyRect, ImagePlus1.Picture.Graphic); end; |
Da fehlt mir noch der entscheidende Dreh an der Sache! 
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 13.11.06 22:58
So ists aber Blödsinn, du musst ja nur die Höhe an die Breite von 69 Pixeln anpassen. So kommt da IMHO eigentlich Blödsinn heraus.
Ich dachte eigentlich, dass nur das 0,0 falsch wäre...
galagher hat folgendes geschrieben: | Zum Speichern sollten alle Miniaturen exakt die selbe Anzahl an Bytes haben. |
Bei Bitmaps ist das bei derselben Größe automatisch so. Das Problem ist: Die Größe der Bilder ist unterschiedlich. Das geht also nicht, es sei denn du speicherst die Ränder mit, sodass du immer 69 mal 69 Pixel hast.
Aber mir fällt ehrlich gesagt kein einziger sinnvoller Grund ein, warum die alle die gleiche Größe haben sollten. Ist doch Platzverschwendung, wenn man die extra auf ne feste Größe aufbläht. 
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Di 14.11.06 18:17
jaenicke hat folgendes geschrieben: | So ists aber Blödsinn, du musst ja nur die Höhe an die Breite von 69 Pixeln anpassen. So kommt da IMHO eigentlich Blödsinn heraus.
Ich dachte eigentlich, dass nur das 0,0 falsch wäre... |
Ich habe jetzt also folgenden Code, das Ergebnis siehe unten im Beispiel.bmp:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| X := ImagePlus1.Picture.Width; Y := 69 * ImagePlus1.Picture.Height div ImagePlus1.Picture.Width;
MyRect := Rect(0, Y div 2, X, Y);
ImagePlus2.Canvas.CopyMode := cmSrcCopy; ImagePlus2.Canvas.StretchDraw(MyRect, ImagePlus1.Picture.Graphic); |
Irgendwas mache ich falsch...
jaenicke hat folgendes geschrieben: | Bei Bitmaps ist das bei derselben Größe automatisch so. |
Stimmt.
jaenicke hat folgendes geschrieben: | Aber mir fällt ehrlich gesagt kein einziger sinnvoller Grund ein, warum die alle die gleiche Größe haben sollten. |
Ich habe eine Funktion LoadBitmapsFromFile, die Bitmaps, die in einer einzigen Datei gesammelt gespeichert sind, in eine ImageList laden kann. Dazu muss man die Grösse der einzelnen Bitmaps angeben.
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!
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Di 14.11.06 18:57
jaenicke hat folgendes geschrieben: | Ich würde mal vermuten, dass jetzt das Seitenverhältnis stimmt, nur dass das Bild ganz oben im zweiten hängt, oder? Wen nicht, hättest du mal dazusagen müssen, was bei rauskommt.
Jedenfalls vermute ich nur, dass du das Zielrechteck nur noch statt bei (0, 0) bei (0, y div 2) anfangen lassen musst.
jaenicke hat folgendes geschrieben: | Davon nochmal die Hälfte muss das Bild nach unten verschoben werden. |
|
Mit diesem Code hängt das Bild links und oben, "freie" Bereiche werden weiss gezeichnet - s. Beispielbild. Das Ergebnis ist zudem noch etwas verzerrt, wobei die Verzerrung umso deutlicher ist, je weniger quadratisch das Original ist:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| X := 69 * ImagePlus1.Picture.Width div ImagePlus1.Picture.Height; Y := 69 * ImagePlus1.Picture.Height div ImagePlus1.Picture.Width;
MyRect := Rect(0, 0, X, Y);
ImagePlus2.Canvas.CopyMode := cmSrcCopy; ImagePlus2.Canvas.StretchDraw(MyRect, ImagePlus1.Picture.Graphic); |
Kann diesen Code bitte jemand korrigieren? Ich habe schon alles mögliche versucht.
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!
|
|
wulfskin
      
Beiträge: 1349
Erhaltene Danke: 1
Win XP
D5 Pers (SSL), D2005 Pro, C, C#
|
Verfasst: Di 14.11.06 19:28
Hey,
ich würde dir gerne Helfen, aber ich blick net, was du eigentlich willst. Du möchtest ein Bild verkleinern, aber die Proportionen erhalten? Dann sind die Stichworte doch StretchRect und ein ganz klein wenig Mathematik.
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 19:34
wulfskin hat folgendes geschrieben: | Du möchtest ein Bild verkleinern, aber die Proportionen erhalten? Dann sind die Stichworte doch StretchRect und ein ganz klein wenig Mathematik. |
Aber wie? Was muss ich machen, damit ein Bild verkleinert und proportional korrekt gezeichnet wird? Wo in meinem Code ist der Fehler?
StretchRect ? 
_________________ 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: Di 14.11.06 19:43
Eine Suche nach StretchRect hätte wohl gereicht  !
Aus dem Kopf:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure Stretchbitmap(const AIn: TBitmap; const AScale: Double; out AOut: TBitmap); begin AOut.Width := Trunc(AIn.Width * AScale); AOut.Height := Trunc(AIn.Height * AScale); AOut.Canvas.StretchDraw(Rect(0, 0, AOut.Width, AOut.Height), AIn); end; | 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 19:50
Danke... In der Delphi-Hilfe hab' ich StrechRect nicht gefunden, und - ohne den Code jetzt getestet zu haben - es sind nicht unbedingt Bitmaps, die gezeichnet werden sollen, es können auch andere Grafikformate sein. Tatsache ist, dass ich einen Code brauche, der damit arbeitet!
Wenn jemand noch einen Tipp hat - ich komme nicht weiter! 
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
|