Autor Beitrag
galagher
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: 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:
ausblenden 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
 {Klappt nicht wie gewünscht!}
 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;

 {-- Oder: --}

 {Klappt ebenfalls nicht wie gewünscht!}
 MyRect := Rect(006969);

 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2750

Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
BeitragVerfasst: 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 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: Mo 13.11.06 19:08 
user profile iconMarco D. hat folgendes geschrieben:
Liegt das Bild als TBitmap vor?

Kann auch ein Jpg oder Gif sein.

Habe jetzt das hier versucht, aber ...
ausblenden Delphi-Quelltext
1:
2:
3:
 MyRect := Rect(00, ImagePlus1.Picture.Width, ImagePlus1.Picture.Height);
 MyOther := Rect(006969);
 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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 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: 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! :cry:

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

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 13.11.06 19:44 
Moin!

Schau mal nach sowas: Suche in: Delphi-Forum, Delphi-Library 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 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: 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:
ausblenden 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 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: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 13.11.06 22:23 
user profile iconelundril 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 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: Mo 13.11.06 22:44 
user profile iconjaenicke 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.

user profile iconjaenicke 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?
ausblenden 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(00, 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.
user profile iconjaenicke hat folgendes geschrieben:
Davon nochmal die Hälfte muss das Bild nach unten verschoben werden.
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: Mo 13.11.06 22:52 
Funktioniert prinzipiell, aber verzerrt immer noch etwas:
ausblenden 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(00, 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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. :shock: :gruebel:
Ich dachte eigentlich, dass nur das 0,0 falsch wäre...

user profile icongalagher 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. :gruebel:
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: Di 14.11.06 18:17 
user profile iconjaenicke 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. :shock: :gruebel:
Ich dachte eigentlich, dass nur das 0,0 falsch wäre...

Ich habe jetzt also folgenden Code, das Ergebnis siehe unten im Beispiel.bmp:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
 X := ImagePlus1.Picture.Width;  //Richtig, oder?
 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...

user profile iconjaenicke hat folgendes geschrieben:
Bei Bitmaps ist das bei derselben Größe automatisch so.

Stimmt.

user profile iconjaenicke 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 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: Di 14.11.06 18:57 
user profile iconjaenicke 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.
user profile iconjaenicke 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:
ausblenden 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(00, 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: 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 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: Di 14.11.06 19:34 
user profile iconwulfskin 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 ? :gruebel:

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

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Di 14.11.06 19:43 
Eine Suche nach StretchRect hätte wohl gereicht :roll:!
Aus dem Kopf:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
//Scale = Faktor zur Vergrößerung/Verkleinerung (100%=1)
//In, Out... Bitmaps
//Out muss initialisiert sein...
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(00, AOut.Width, AOut.Height), AIn);
end;
Gruß Hape!

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
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: 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!