Bagaimana cara mengubah ukuran kanvas PNG dengan ImageMagick (GraphicsMagick)? (Bagaimana cara pad dengan transparansi?)

9

Sebagai alternatif: Bagaimana cara mengambil PNG non-kuadrat dan "mengisi" sisa "gambar dengan transparansi sehingga gambar persegi yang dihasilkan memiliki gambar asli terpusat di alun-alun?

Pada akhirnya, yang saya inginkan adalah mengambil gambar apa pun dari format apa pun yang didukung GM dari ukuran apa pun, dan membuat PNG yang diperkecil (katakanlah, maksimum 40 piksel untuk dimensi mana pun), dengan rasio aspek dipertahankan, transparansi berlapis untuk non-persegi gambar asli, DAN dengan topeng transparansi PNG 40x40 yang sudah disiapkan diaplikasikan.

Saya sudah tahu cara menurunkan skala dan menjaga rasio aspek; Saya sudah memiliki perintah untuk menerapkan komposit saya. Satu-satunya bagian saya yang hilang adalah gambar non-bujur sangkar persegi (padding dengan transparansi).

Perintah tunggal lebih disukai; rantai multi-perintah dapat diterima.

(edit)

Info tambahan: Inilah perintah gabungan yang saya gunakan:

gm composite -compose copyopacity mask.png source-and-target.png source-and-target.png

di mana mask.png memiliki piksel putih untuk apa yang ingin saya simpan dari source-dan-target.png dan piksel transparan untuk apa yang ingin saya hapus (dan menjadi transparan) dari source-and-target.png.

Pistos
sumber

Jawaban:

7

Perintah ini akan mengambil file input berukuran apa pun dan paling cocok untuk persegi 40x40 dan pad dengan transparansi:

convert \
   original.png \
  -thumbnail '40x40>' \
  -background transparent \
  -gravity center \
  -extent 40x40 \
  -compose Copy_Opacity \
  -composite mask.png \
   original-resized.png

The gravitypilihan memastikan gambar berpusat di kedua arah, dan transparentdigunakan di mana pun tidak ada piksel. Kemudian pengomposisian dilakukan denganmask.png

Paul
sumber
Jadi kita tidak bisa melakukannya dalam satu kesempatan composite?
Pistos
@Pistos Saya tidak jelas tentang apa yang Anda lakukan dengan komposit - itu hanya topeng transparansi untuk menyembunyikan / menampilkan sebagian thumbnail setelah mengubah ukuran? Bisakah Anda mengedit dan menambahkan urutan perintah yang Anda miliki sejauh ini, sehingga kami dapat melihat apakah itu dapat digabungkan?
Paul
@Pistos Saya pikir pendekatan terbaik adalah melakukan compositing dengan -convert daripada sebaliknya. Saya telah memperbarui jawaban saya di atas.
Paul
Tutup, tetapi tidak cukup. Perintah Anda tidak berfungsi apa adanya, dan bahkan dengan penyesuaian, itu tidak berhasil. Tidak apa-apa, saya akan melakukannya dalam dua langkah. Saya akan memperbarui hal-hal di sini setelah saya mendapatkan langkah akhir, bekerja CLI. Terima kasih lagi.
Pistos
Saya akan menambahkan -filter Catromsebelum thumbnailopsi karena dari pengalaman saya umumnya menghasilkan gambar berkualitas lebih tinggi.
thdoan
6

Satu perintah untuk mengonversi semua PNG dari satu folder:

mogrify \
 -resize 50x50 \
 -background transparent \
 -gravity center \
 -extent 50x50 \
 -format png \
 -path resized \
 *.png

mogrify adalah perintah dari paket ImageMagick. Anda harus membuat direktori keluaran terlebih dahulu.

uı6ʎɹnɯ ꞁəıuɐp
sumber
Bagus BTW, Jika Anda merasa ingin bertualang, Anda dapat menghilangkan -path resizeduntuk mengedit file di tempat.
aaronk6
Ini bagus. Pada instal saya (OSX, 1.3.35) gm mogrifydan alih-alih -path resized, gunakan-create-directories -output-directory resized
Blake
1

Inilah yang akhirnya saya ikuti. Proses dua langkah:

gm convert \
  -thumbnail '40x40>' \
  -background transparent \
  -gravity center \
  -extent 40x40 \
   original.png \
   intermediate.png

gm composite \
  -compose in \
   intermediate.png \
   mask.png \
   out.png

Di mana mask.png adalah piksel putih untuk apa yang ingin saya simpan, dan piksel transparan untuk apa yang ingin saya tutupi (buang).

Pistos
sumber