Jak zmienić DPI pliku PNG? (w linii poleceń, bez ImageMagick)

9

Szukam sposobu zmiany DPI w plikach obrazów PNG. Za pomocą ImageMagick jest to łatwe:

$ convert -density 150 -units pixelsperinch file.png file.png

Problem polega na tym, że uruchomię to polecenie z mojej aplikacji, działającej na wielu maszynach wirtualnych, na których nie zainstalowano ImageMagick. Mogę wypchnąć pakiety aktualizacji na te maszyny wirtualne, ale w przypadku ImageMagick, który dodałby około 30 MB do pakietu aktualizacji, co jest nieco za dużo jak na mój przypadek użycia.

Krótko mówiąc : czy istnieje sposób, aby zmienić DPI pliku PNG za pomocą małego narzędzia wiersza polecenia (jak w rozmiarze pakietu)?

Opcjonalnie zmiana bajtów w pliku surowego obrazu również byłaby w porządku, jeśli ktoś wie, gdzie ich szukać ...

johndodo
źródło
Możesz rozważyć wykonanie własnej implementacji. Manipulowanie fragmentami PNG jest dość proste. Jeśli zamierzasz zastosować tylko jedno określone DPI do wszystkich z nich, nie potrzebujesz nawet działającej funkcji sumy kontrolnej - po prostu skopiuj wstępnie przygotowany pHYsfragment z pliku PNG wykonanego w Photoshopie.
Zdenek

Odpowiedzi:

6

Czy 2,10 MB jest wystarczająco małe? Jeśli tak, użyj NConvert i polecenia wsadowego, takiego jak:

nconvert -out png -dpi 150 -keepdocsize -keepfiledate mysource.png

Do czego służy NConvert?

XnView to aplikacja oparta na graficznym interfejsie użytkownika, możesz zmieniać obrazy i manipulować nimi za pomocą graficznego interfejsu użytkownika. NConvert ma prawie takie same możliwości jak XnView, ale jest narzędziem wiersza poleceń i nie ma graficznego interfejsu użytkownika. Możesz użyć NConvert w skryptach wsadowych lub inna aplikacja może to nazwać.

Przydatne linki

  • Przewodnik dla początkujących i Wiki z kilkoma przykładami na początek
  • Plik pomocy, aby zobaczyć, jakie parametry wiersza polecenia są dostępne (przesłane na pastebin)
  • Graficznym interfejsem używającym Nconvert jest XnConvert . Użyj tego do tworzenia i eksportowania plików wsadowych Nconvert
  • Forum dla Xnconvert i Nconvert dla
nixda
źródło
Dzięki, wygląda świetnie i prawdopodobnie przyda się w przyszłości! W tym przypadku skończyłem studiować format PNG (który na szczęście był dość prosty) i zmieniać obrazy za pomocą małej niestandardowej aplikacji (15 linii w PHP).
johndodo
@johndodo Brzmi interesująco. Czy chcesz podzielić się z nami swoją aplikacją?
nixda
Niestety nie mam takiej możliwości, ale możesz zrobić to samo, czytając (świetną!) Specyfikację formatu pliku PNG i tworząc aplikację, która zmienia fragment pHY . To naprawdę proste, gdy wiesz, co robisz.
johndodo
1

Wspomniałeś, że uruchamiasz to polecenie „z poziomu aplikacji”, co prowadzi mnie do przekonania, że ​​napisałeś tę aplikację lub ją utrzymujesz. To powiedziawszy, istnieją interfejsy API ImageMagick dla kilku języków i możesz użyć jednego z nich, aby dodać funkcjonalność bezpośrednio do istniejącego programu. Zwiększenie rozmiaru pakietu będzie zależeć od języka, w którym napisana jest aplikacja oraz od połączenia biblioteki statycznie czy dynamicznie, ale wyobrażam sobie, że byłby znacznie mniejszy niż wzrost o 30 MB.

Inną opcją nie jest dołączenie całego pakietu ImageMagick. Możesz pobrać plik ImageMagick Zip (który ma tylko 13 MB BTW) i wyodrębnić tylko convertnarzędzie oraz jego zależności i rozpowszechnić je na maszynie wirtualnej. Istnieje narzędzie o nazwie Dependency Walker , za pomocą którego można określić, jakie są zależności tego convertnarzędzia.

Drew Chapin
źródło
1

Użyj -sizeflagi w programie pnmtopng netpbm . Zastosowane jednostki to piksele na metr. Poniższy przykład ustawi newfile.png na 300dpi.

pngtopnm <oldfile.png | pnmtopng -size='11811 11811 1' >newfile.png
Diomidis Spinellis
źródło
0

Cóż, potencjalnie możesz użyć skryptu python.

#!/usr/bin/python
im = Image.open("in.png")
nx, ny = im.size
im2 = im.resize((int(nx*1.5), int(ny*1.5)), Image.BICUBIC)
im2.save("out.png")

Źródło .

Goncalo
źródło
Instalator Python 3.3.2 (bez kodu źródłowego) ma 19,3 MB, a instalator Python 2.7.5 - 15,5 MB.
Drew Chapin,
5
Spowoduje to zmianę rozmiaru obrazu, a nie zmianę DPI.
Bobby
0

Właściwym wierszem polecenia „Konwertuj” Magi obrazu jest do tego użycie argumentu -resample:

convert image.png -resample 150x150 -units pixelsperinch ../ImagesAdjusted/image.png
tolistim
źródło