fisi-pjm
Goto Top

Tool zum vergrößern der "Leinwand" bei vielen PNG Bilddateien

Hi,

Ich hab einen Ordner mit hunderten PNG Files. Die Aufgabe für die ich jetzt eine elegante Lösung suche ist folgende:
Bei jedem PNG in diesem Ordner muss die Leinwand in der Vertikalen um den Faktor 2 vergrößert werden.
Ich spreche nicht von Skalieren oder Stretchen des Bilds sondern davon das der Transparente Hintergrund um den Faktor 2 in der höhe Vergrößert wird.

Beispiel:
Es liegt ein Bild mit 30x60 Auflösung in dem Ordner
30 ist die Breite
60 ist die Höhe
Das Bild darin Füllt die Datei Vollflächig aus, ist also auch 30x60 groß.

Nachdem das Tool drüber gelaufen ist, hätte ich gern ein Bild das dann 30x120 groß ist.
In dem Bild soll dann im oberen Bereich ein 30x60 großes Bild sein und im unteren Bereich eine 30x60 große transparente Fläche.

Kennt ihre ein Tool mit dem ich das für ein paar hundert Dateien auf einmal machen kann?

MFG
PJM

Content-ID: 3338697093

Url: https://administrator.de/contentid/3338697093

Ausgedruckt am: 21.11.2024 um 12:11 Uhr

godlie
godlie 14.07.2022 aktualisiert um 15:03:58 Uhr
Goto Top
Hallo,
auf die schnelle würde ich das mit ImageMagick realisieren:

https://imagemagick.org/script/mogrify.php

magick mogrify -extent 30x120 -gravity North -fill white *.png

ansonsten als Suchbegriff PNG Batch Resize Canvas Size
Lochkartenstanzer
Lochkartenstanzer 14.07.2022 um 14:56:07 Uhr
Goto Top
Moin,

Imagemagick ist das "Standardtool" für so etwas. face-smile

lks
Lochkartenstanzer
Lochkartenstanzer 14.07.2022 um 14:58:48 Uhr
Goto Top
Zitat von @godlie:

... ImageMagick ...

mogrify ...


Viele Wege führen zum Ziel. Ich hätte convert genommen. (siehe meinen Link). face-smile

lks
colinardo
colinardo 14.07.2022 aktualisiert um 15:11:31 Uhr
Goto Top
Servus.
Viele Wege führen zum Ziel.
Jepp.
Oder man nimmt bspw. die Bordmittel der Powershell:
$folder = 'D:\Bilder'  
Add-Type -A System.Drawing

foreach($file in Get-ChildItem $folder -File -Filter *.png){
    $img = [System.Drawing.Bitmap]::FromFile($file.Fullname)
    $new = New-Object System.Drawing.Bitmap 30,120
    [System.Drawing.Graphics]::FromImage($new).DrawImage($img,0,0,$img.Width,$img.Height)
    $new.Save("$($file.DirectoryName)\$($file.Basename)_30x120$($file.Extension)",'Png')  
    $img.Dispose(); $new.Dispose()
}
oder irfanview,python, php, c# usw. usw. endless possibilities ...

Grüße Uwe
fisi-pjm
fisi-pjm 14.07.2022 um 15:16:10 Uhr
Goto Top
Danke für die vielzahl an möglichen Lösungwegen face-smile
@colinardo
Ich bin leider in der Powershell nicht so zu Hause wie ich das gerne wäre. Man kann doch über den $file dann sicherlich auch auf die bestehende Höhe zugreifen und den einfach mit 2 multiplizieren.
Das war ja mein ursprungswunsch face-smile

LG
PJM
colinardo
Lösung colinardo 14.07.2022 aktualisiert um 15:27:37 Uhr
Goto Top
Zitat von @fisi-pjm:
@colinardo
Ich bin leider in der Powershell nicht so zu Hause wie ich das gerne wäre. Man kann doch über den $file dann sicherlich auch auf die bestehende Höhe zugreifen und den einfach mit 2 multiplizieren.
Das war ja mein ursprungswunsch face-smile
Jepp kein Problem
$folder = 'D:\Bilder'  
Add-Type -A System.Drawing

foreach($file in Get-ChildItem $folder -File -Filter *.png){
    $img = [System.Drawing.Bitmap]::FromFile($file.Fullname)
    $new = New-Object System.Drawing.Bitmap $img.Width,($img.Height*2)
    [System.Drawing.Graphics]::FromImage($new).DrawImage($img,0,0,$img.Width,$img.Height)
    $new.Save("$($file.DirectoryName)\$($file.Basename)_resized$($file.Extension)",'Png')  
    $img.Dispose(); $new.Dispose()
}
fisi-pjm
fisi-pjm 14.07.2022 um 15:38:19 Uhr
Goto Top
Ich glaube irgendwo ist da noch ein Denkfehler drin.
Ich lese zwar "DrawImageUnscaled" aber mein Bild ist danach auf die Höhe gestreckt und in der Mitte abgeschnitten.
Hast du noch eine Idee?
colinardo
colinardo 14.07.2022 aktualisiert um 16:12:01 Uhr
Goto Top
Zitat von @fisi-pjm:

Ich glaube irgendwo ist da noch ein Denkfehler drin.
Ich lese zwar "DrawImageUnscaled" aber mein Bild ist danach auf die Höhe gestreckt und in der Mitte abgeschnitten.
Hast du noch eine Idee?
Hm, läuft hier im Test einwandfrei ohne Verzerrung. Hier wird rein gar nichts skaliert.
Der Hintergrund unten ist transparent, nicht irritieren lassen.
https://docs.microsoft.com/de-de/dotnet/api/system.drawing.graphics.draw ...

screenshot

screenshot
fisi-pjm
fisi-pjm 14.07.2022 um 15:45:27 Uhr
Goto Top
Schau mal bei mir, vorher nacher
_resized_dreieck_blau_groß
dreieck_blau_groß
colinardo
colinardo 14.07.2022 aktualisiert um 15:54:08 Uhr
Goto Top
Kannst du mir das Bild mal im original zum Download bereitstellen? Evt. eine Bilderfolge im PNG enthalten ...
Habe die Methode DrawImageUnscaled mal auf DrawImage gestellt sollte hier aber keinen Unterschied machen da keine Skalierung im Code vorgenommen wird.
fisi-pjm
fisi-pjm 14.07.2022 um 15:55:35 Uhr
Goto Top
Hier ein Link zum Original:
Bild-Download
Was meinst du mit Bilderfolge?
colinardo
colinardo 14.07.2022 aktualisiert um 16:12:50 Uhr
Goto Top
Merci, habe es oben gefixt, sorry, war die DPI schuld.

screenshot
fisi-pjm
fisi-pjm 14.07.2022 um 16:13:10 Uhr
Goto Top
Zitat von @colinardo:

Merci, habe es oben gefixt, sorry, war die DPI schuld.

Kein Problem, Danke für die superschnelle Antwort.
Ging leider immer noch nicht, aber der Hinweis mit den DPI war genau richtig. Ich war an einer Maschiene mit high DPI per Remote Desktop aufgeschaltet. Hab die Connection gekillt und neu ohne High DPI gestartet jetzt hats funktioniert. Danke.
108012
108012 14.07.2022 um 16:24:48 Uhr
Goto Top
Hallo,

Nachdem das Tool drüber gelaufen ist, hätte ich gern ein Bild das dann 30x120 groß ist.
Irfanview macht so etwas auch und sogar als Batch für mehrere zig Bilder recht schnell.

Dobby
rubberman
rubberman 16.07.2022 um 11:36:49 Uhr
Goto Top
Zitat von @fisi-pjm:

Ging leider immer noch nicht, ...

Bin gerade an einem HiDPI Monitor. Ich kann den Effekt nicht feststellen. Aber falls du noch mal in die Verlegenheit kommst, kannst du versuchen den PowerShell Prozess DPI-aware zu stellen. Die paar Zeilen an den Anfang des Scripts stellen:
$pinvoke=Add-Type -Name W32 -PassThru -MemberDefinition @'  
  [DllImport("user32.dll")] public static extern void SetProcessDPIAware();  
  [DllImport("shcore.dll")] public static extern void SetProcessDpiAwareness(int value);  
'@  
try{ $pinvoke::SetProcessDpiAwareness(2) } # per monitor DPI awareness (since Win 8.1)
catch{ $pinvoke::SetProcessDPIAware() } # fallback to system DPI awareness (since Vista)

Steffen