Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Seitenverhältnis von PNG-Grafiken ändern (https://www.delphipraxis.net/167102-seitenverhaeltnis-von-png-grafiken-aendern.html)

100nF 13. Mär 2012 15:49


Seitenverhältnis von PNG-Grafiken ändern
 
Hallo zusammen,

Ich habe hier sehr viele PNG-Bilder, in allen möglichen Auflösungen und Seitenverhältnissen, also alles wild durcheinander. Einzig der Dateityp ist bei allen gleich :-)

Diese Dateien sollten jetzt irgendwie in ein bestimmtes Seitenverhältnis gebracht werden, und zwar vollautomatisch weil es viel zu viele wären um es von Hand zu machen.

Das heisst also, die Abmessungen der Bilder müssen eingelesen werden, um dann entscheiden zu können ob das Bild links und rechs, oder oben und unten erweitert werden muss. Das ursprüngliche Bild soll schlussendlich in der Mitte des neuen, grösseren Bildes liegen. Schön wäre auch noch ein Rand von vielleicht 10 Pixel, der rund ums ursprüngliche Bild hinzugefügt wird. Die Bilder haben alle einen weissen Hintergrund, und das sollen sie auch nach dem Bearbeten noch haben.

Es ist nur eine einmalige Sache, deshalb ist es mir völlig wurscht wie das passieren soll. Ich habe viel im Internet gesucht, vorallem irgendwelche Bash-Skripte für Linux, habe aber leider nichts passendes gefunden. Bin auch kein Skript-Profi, also selberschreiben fällt weg. Da dachte ich halt ich versuchs mit Delphi, das liegt mir am besten.

Das Auflisten und Anzeigen der Dateien sowie die Bestimmung der aktuellen Grösse und der neuen Grösse ist auch kein Problem. Danach happerts dann aber bei der Erzeugung eines neuen, leeren PNGs. Darf ich das mit einem TBitmap machen? Ich muss die Bilder wieder als PNG abspeichern können, und zwar möglichst ich gleicher Qualität wie sie ursprünglich waren.

Wäre super wenn mir da jemand Tipps geben könnte! Wie gesagt, es muss nicht mit Delphi sein, ist mir egal wie das ganze ablaufen soll, hauptsache das Ergebnis passt :-)

Viele Grüsse
Urban

CCRDude 13. Mär 2012 15:54

AW: Seitenverhältnis von PNG-Grafiken ändern
 
Spontan: "Batch conversion" in IrfanView. Ne Menge Dateien aussuchen, "Use advanced options" anwählen, dort "RESIZE" mit vorgegeben Werten, und natürlich "Preserve aspect ratio".

Wenn Du wirklich noch einen Rahmen haben willst, das ganze nochmal mit "Don't enlarge smaller images".

Gleiche Qualität ist natürlich "unmöglich" - jede Größenveränderung (wenn es um die Größe in Pixeln geht, wenn es um die Druckgröße geht, wäre es eine Option, die DPI anzupassen) bedeutet umrechnen. Aber die Qualität von IrfanViews Größenänderungen ist mMn ganz in Ordnung.

100nF 13. Mär 2012 16:02

AW: Seitenverhältnis von PNG-Grafiken ändern
 
Hallo CCRDude,

Zitat:

Zitat von CCRDude (Beitrag 1156351)
Spontan: "Batch conversion" in IrfanView. Ne Menge Dateien aussuchen, "Use advanced options" anwählen, dort "RESIZE" mit vorgegeben Werten, und natürlich "Preserve aspect ratio".

Entweder hast du mich falsch verstanden, oder ich versteh deine Antwort falsch :-) "Preserve aspect ratio" heisst ja "Seitenverhältnis beibehalten", aber genau das möchte ich ja nicht. Ich möchte das Seitenverhältnis ändern, indem ich oben+unten oder links+rechts das Bild erweitere mit weissem Hintergrund.

Zitat:

Zitat von CCRDude (Beitrag 1156351)
Gleiche Qualität ist natürlich "unmöglich" - jede Größenveränderung (wenn es um die Größe in Pixeln geht, wenn es um die Druckgröße geht, wäre es eine Option, die DPI anzupassen) bedeutet umrechnen. Aber die Qualität von IrfanViews Größenänderungen ist mMn ganz in Ordnung.

Nein, das sollte eben nicht unmöglich sein. Das ursprüngliche Bild bleibt ja genau so bestehen wie es war, ist also genau gleichviele Pixel hoch und breit. Es wird lediglich der Hintergrund des Bildes erweitert, so dass das gesamte Bild (mit Hintergrund) schlussendlich grösser ist als das ursprüngliche.

Das Bild soll also einfach in ein etwas grösseres, leeres Bild hineinkopiert werden.
Ich hoffe das ist jetzt verständlich :-)

CCRDude 13. Mär 2012 16:22

AW: Seitenverhältnis von PNG-Grafiken ändern
 
Ah, ok, zwei Mißverständnisse :)

Für Argument 2: Dann verwende gleich "Don't enlarge smaller images" :)

Für Argument 1: Ich vermute, "Preserve Aspect Ratio" bezieht sich nur auf das "Bild im (neuen größeren) Bild". Wegen obigen Punktes wird diese Option aber eh unnötig, da hatte ich Dich falsch verstanden.

Oder anders gesagt: so dürfte das im IV noch einfacher sein.

100nF 13. Mär 2012 16:57

AW: Seitenverhältnis von PNG-Grafiken ändern
 
Also ich glaube nicht, dass IrfanView das kann.

Ich habe jetzt mal folgendes probiert:
(Alle Bilder sind zwischen 400 und 1000 Pixel breit und hoch)

RESIZE auf "set new size", "Set one or both sides to": Grösse versuchshalber 320x240 und 1600x1200
und Haken bei "Preserve aspect ratio" und "Don't enlarge smaller images"

Ergebnis: Die Bilder werden einfach nur runterskaliert, keine Änderung am Seitenverhältnis.
Ohne "Preserve aspect ratio": Die Bilder werden gestaucht.
Ohne "Don't enlarge smaller Images": Die Bilder werden nur rauf- bzw. runterskaliert.
Ohne beides: Die Bilder werden gestreckt bzw. gestaucht.

Das gewünschte Ergebnis konnte ich nicht erzielen. Ist aber auch kein Wunder wenn IV das nicht kann, braucht irgendwie ja auch kein Mensch :-)

100nF 13. Mär 2012 17:06

AW: Seitenverhältnis von PNG-Grafiken ändern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe mal ein Bild gezeichnet wie ich mir das vorstelle, spätestens jetzt sollte es leicht verständlich sein was ich erreichen will :-)

Das ist jetzt ohne die ca. 10 Pixel Rahmen die ich mal erwähnt habe, die sind (vorerst) aber auch egal.
Das Bild wird einfach nur erweitert, damit sich ein anderes Seitenverhältnis ergibt.

Gustav.R 13. Mär 2012 17:52

AW: Seitenverhältnis von PNG-Grafiken ändern
 
Ja, das sollte mit IrfanView gehen, wie CCRDude schon geschrieben hat!

Probier IrfanView doch einfach aus, ist doch (super!) Freeware...

Mit der Zeit, die wir hier "vertrödeln", hättest Du's schon ein paarmal testen können, ob es klappt :wink:

GG

100nF 13. Mär 2012 18:15

AW: Seitenverhältnis von PNG-Grafiken ändern
 
Na wenn du wüsstest was ich schon alles ausprobiert habe...
Zuerst auf Linux (arbeite nichtmehr mit Windoof), da gibts auch ein paar wenige aber sehr mächtige Kommandozeilenprogramme um Bilder zu bearbeiten, der bekannteste Befehl ist wohl "convert". Das scheint allerdings für mein Vorhaben nicht mächtig genug zu sein.

Dann habe ich mein virtuelles Windows angeschmissen, da hatte ich IrfanView schon drauf. Nach langem Rumprobieren musste ich auch das aufgeben. Scheint nicht möglich zu sein. Habe dann sogar noch irgendwelche Shareware Programme runtergeladen, aber selbst da wurde ich nicht fündig.

Eigentlich eine so simple Sache - nach genauerem Betrachten scheint es aber doch einiges schwieriger zu sein :-(

Wenn du, Gustav, mir sagen kannst wie ich das mit IrfanView mache hast du meinen Respekt und Dank verdient :-)
Vielleicht bin ich ja auch einfach zu blöd dafür. Ich habe die Aufgabe aber keinesfalls einfach kampflos dem Forum übergeben ;-)

Nachtrag:
Wenn ich mir das Einstellungsfenster von IrfanView so anschaue, finde ich auch keine Einstellung, die das gewünschte Ergebnis vermuten lässt. Also ich meine keine dieser englischen Bezeichnungen scheint für mein Vorhaben "gemacht" zu sein. Müsste ja irgendwie "Fix aspect ratio" oder so ähnlich heissen...

Gustav.R 13. Mär 2012 18:32

AW: Seitenverhältnis von PNG-Grafiken ändern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Weiß ich natürlich nicht!

Ich würde es mal so wie im angehängten Screenshot mit IV angehen.

Häng' doch ein mal ein paar Deiner "ProblemPNGs" an eine Antwort und schreib dazu, was genau rauskommen soll?

GG

Edit1 meint, klick auf "Options/Change language..." dann wird's Deutscher :-)
Edit2 meint, siehe CCRDude "Use advanced options"!

100nF 13. Mär 2012 18:53

AW: Seitenverhältnis von PNG-Grafiken ändern
 
Liste der Anhänge anzeigen (Anzahl: 2)
Das geht leider auch nicht, habe ich auch schon probiert.
Die tatsächliche Grösse des Ausgabebildes soll ja von der Grösse des Eingabebildes abhängig sein. In den von dir genannten Einstellungen gibt man ja die Ausgabegrösse bereits an, und alle Bilder werden dann einfach zentriert in diese Grösse hineinkopiert. Dann ist aber rundherum viel zu viel Rand vorhanden. Es soll aber nur an zwei Seiten (entweder links/rechts oder oben/unten) ein Rand entstehen.

Mein vorher hochgeladenes Bild sollte ja klar genug sein, aber ich kann natürlich auch ein Musterbeispiel anhängen. Das Eingabebild "bild_original.png" soll in ein 4:3 Format gebracht werden ("bild_neu.png"). Sie müssten jetzt genau gleich hoch sein, sind sie aber nicht genau weil ich die Bearbeitung von Hand vorgenommen habe.

Falls jemand weiss wie ich in Delphi ein neues PNG erzeugen une ein anderes da hineinkopieren kann würde mir das ja schon genügen, dann bin ich vollumfänglich zufrieden :-)

EDIT: weiss der Geier warum das Forum eine meiner PNG-Dateien als jpg hochlädt...Habs mehrfach versucht und der Pfad im Edit-Feld endet definitiv mit ".png", nach dem Hochladen ists dann ein jpg :shock:

EDIT2: Ach, und wenn ich bei IV eine geringere Grösse angebe als die Originalbilder schon sind, dann schmiert das Programm ab :-)

Namenloser 13. Mär 2012 19:01

AW: Seitenverhältnis von PNG-Grafiken ändern
 
Ich würde es mal mit ImageMagick probieren. Das Beispiel dort paddet zwar alles auf eine feste Größe, aber ich bin sicher mit ImageMagick geht da auch noch mehr, das Tool ist recht mächtig. Habe aber selbst noch nicht damit gearbeitet, daher keine Ahnung wie es geht...

Unter Delphi kannst du mit der PngImage-Unit PNGs verarbeiten, sofern du die Unit noch findest (wurde von CodeGear gekauft, war aber vorher Open Source). Ansonsten gibt es noch die Lib ImageEn (ok, die ginge aber wohl auch) ähh GraphicEx, die verschiedene Formate, u.a. PNG, unterstützt.

Gustav.R 13. Mär 2012 19:10

AW: Seitenverhältnis von PNG-Grafiken ändern
 
Falls wir wieder zurück bei Delphi sind, würde ich zu GraphicEx raten.

GG

Uwe Raabe 13. Mär 2012 19:35

AW: Seitenverhältnis von PNG-Grafiken ändern
 
Delphi-Quellcode:
var
  hdr: TChunkIHDR;
  origin: TPoint;
  png1: TPngImage;
  png2: TPngImage;
  frame: TRect;
  size: Integer;
begin
  png1 := TPngImage.Create;
  try
    png1.LoadFromFile('c:\Temp\bild_original.png');
    size := Max(png1.Width, png1.Height);
    origin := Point((size - png1.Width) div 2, (size - png1.Height) div 2);
    frame := TRect.Create(origin, png1.Width, png1.Height);
    hdr := png1.Header;
    png2 := TPngImage.CreateBlank(hdr.ColorType, hdr.BitDepth, size, size);
    try
      png2.Canvas.Brush.Color := clWhite;
      png2.Canvas.FillRect(TRect.Create(0, 0, size, size));
      png2.Canvas.Brush.Style := bsClear;
      png1.Draw(png2.Canvas, frame);
      png2.SaveToFile('c:\Temp\bild_neu.png');
    finally
      png2.Free;
    end;
  finally
    png1.Free;
  end;
end;

Popov 13. Mär 2012 19:47

AW: Seitenverhältnis von PNG-Grafiken ändern
 
Zitat:

Zitat von urbanbruhin (Beitrag 1156350)
Ich habe hier sehr viele PNG-Bilder, in allen möglichen Auflösungen und Seitenverhältnissen, also alles wild durcheinander. Einzig der Dateityp ist bei allen gleich :-)

Die Programm das du suchst ist Light Image Resizer. Wenn es nicht im ersten Durchlauf klappt, dann im zweiten:

- im ersten Durchgang alle Bilder in Grenze bringen, d.h. wenn du ein 10x40 Pixel Bild hast und es soll 80x80 Pixel sein, dann wird es zuerst 20x80 Pixel

- im zweiten Durchgang zentrieren wählen, d.h. das obere Bild wird zentriert und bekommt oben und unten je einen 30 Pixel Rand, so dass es 80x80 ist.

100nF 14. Mär 2012 20:28

AW: Seitenverhältnis von PNG-Grafiken ändern
 
Ihr seid genial!!! :firejump:

ImageMagick kannte ich schon von Linux her, habe schon viele Infoseiten über den Befehl "convert" bzw. "mogrify" angeschaut, konnte aber nirgens das richtige finden. NamenLozer hat jetzt aber die Zauberwörter genannt, und zwar "thumbnail" und "extent"! :-D Darauf wäre ich echt nie gekommen. ImageMagick ist so abartig mächtig, keine Chance da den Überblick nicht zu verlieren.

Vielen vielen Dank an alle!

Ich wusste doch auf die Delphi-Praxis ist Verlass :-D

Herzlichen Dank und viele Grüsse
Urban


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz