ImageMagick versi 7 • Pencitraan rentang dinamis tinggi • Kanal piksel • Alpha • Grayscale • Mask • MagickCore API • File header • Fitur usang yang dihapus • Antarmuka baris perintah • Peningkatan performa • Ringkasan perubahan versi 7
Desain ImageMagick merupakan proses evolusioner: upaya desain dan implementasi saling memengaruhi dan mengarahkan kemajuan lebih lanjut satu sama lain. Dengan ImageMagick versi 7, kami menyempurnakan desain berdasarkan pelajaran yang dipetik dari implementasi versi 6. ImageMagick pada awalnya dirancang untuk menampilkan gambar RGB ke server X Windows. Seiring waktu kami memperluas dukungan ke gambar RGBA, lalu ke format gambar CMYK dan CMYKA. Dengan ImageMagick versi 7, kami memperluas dukungan ke ruang warna apa pun dengan jumlah kanal piksel berapa pun. Selain itu, ImageMagick 7 menyimpan kanal piksel sebagai float sehingga memungkinkan nilai di luar rentang (misalnya negatif) dan mengurangi kesalahan pembulatan. Masih banyak penyempurnaan desain lainnya yang dijelaskan di sini.
Untuk mendukung kanal piksel yang bervariasi pada API MagickCore, penanganan piksel berubah saat mengambil atau menetapkan kanal piksel. Anda dapat mengakses kanal sebagai array, pixel[i], atau menggunakan metode aksesor seperti GetPixelRed() atau SetPixelRed(). Ada beberapa perubahan kecil pada API MagickCore dan MagickWand. API Magick++ dan PerlMagick tidak berubah dan tetap sama dengan ImageMagick versi 6.
Shell API (baris perintah) ImageMagick versi 7 telah dirombak secara besar-besaran, dengan penekanan khusus pada kemampuan membaca 'opsi' tidak hanya dari baris perintah, tetapi juga dari skrip dan file stream. Ini memungkinkan penggunaan teknik pemrograman 'co-processing' atau penanganan gambar menggunakan 'backend daemon/server', bahkan pemrosesan terdistribusi lintas banyak mesin.
Bersamaan dengan perombakan shell API, dilakukan pula perbaikan lain, termasuk: pelaporan yang lebih baik mengenai opsi mana yang gagal, konsolidasi dan penghapusan (deprecation) opsi, serta penggunaan 'properti gambar' (lebih dikenal sebagai 'escape persen' dalam argumen opsi) yang lebih meluas.
ImageMagick versi 7 kini tersedia sebagai rilis produksi.
Sekarang setelah ImageMagick versi 7 dirilis, kami tetap mendukung versi 6 selama minimal 10 tahun. Dukungan untuk versi 6 terutama terbatas pada perbaikan bug dan patch keamanan, dengan sedikit peningkatan fitur.
Pencitraan rentang dinamis tinggi
ImageMagick versi 7 mengaktifkan pencitraan rentang dinamis tinggi (HDRI) secara default. HDRI merepresentasikan secara akurat rentang tingkat intensitas yang luas yang ditemukan pada pemandangan nyata, mulai dari sinar matahari langsung yang paling terang hingga bayangan yang paling gelap dan dalam. Selain itu, hasil pemrosesan gambar menjadi lebih akurat. Kekurangannya, HDRI membutuhkan lebih banyak memori dan dapat menyebabkan waktu pemrosesan lebih lambat. Jika Anda melihat perbedaan hasil antara baris perintah versi 6 dan versi 7, kemungkinan besar penyebabnya adalah HDRI. Anda mungkin perlu menambahkan -clamp ke baris perintah untuk membatasi piksel ke rentang 0 .. QuantumRange, atau menonaktifkan HDRI saat membangun ImageMagick versi 7. Untuk menonaktifkan HDRI (disarankan untuk build ponsel pintar seperti iOS atau situs produksi yang mengutamakan performa), cukup tambahkan --disable-hdri ke baris perintah skrip configure saat membangun ImageMagick.
Kanal piksel
Piksel terdiri dari satu atau lebih nilai warna, atau kanal (misalnya kanal piksel merah).
Versi ImageMagick sebelumnya (4-6) mendukung 4 hingga 5 kanal piksel (RGBA atau CMYKA). Empat kanal pertama diakses melalui struktur data PixelPacket. Struktur ini mencakup 4 anggota bertipe Quantum (biasanya 16-bit) untuk merah, hijau, biru, dan opacity. Kanal hitam atau indeks colormap didukung oleh metode dan struktur terpisah, IndexPacket. Sebagai contoh, berikut cuplikan kode dari ImageMagick versi 6 yang membalikkan (negate) komponen warna (tetapi bukan komponen alpha) pada piksel gambar:
for (y=0; y < (ssize_t) image->rows; y++)
{
IndexPacket
*indexes;
PixelPacket
*q;
q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
if (q == (PixelPacket *) NULL)
{
status=MagickFalse;
continue;
}
indexes=GetCacheViewAuthenticIndexQueue(image_view);
for (x=0; x < (ssize_t) image->columns; x++)
{
if ((channel & RedChannel) != 0)
q->red=(Quantum) QuantumRange-q->red;
if ((channel & GreenChannel) != 0)
q->green=(Quantum) QuantumRange-q->green;
if ((channel & BlueChannel) != 0)
q->blue=(Quantum) QuantumRange-q->blue;
if (((channel & IndexChannel) != 0) &&
(image->colorspace == CMYKColorspace))
indexes[x]=(IndexPacket) QuantumRange-indexes[x];
q++;
}
if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
status=MagickFalse;
}
ImageMagick versi 7 mendukung jumlah kanal berapa pun dari 1 hingga 64 (bahkan lebih) dan menyederhanakan akses dengan satu metode tunggal yang mengembalikan array kanal piksel bertipe Quantum. Kode sumber yang dikompilasi terhadap versi ImageMagick sebelumnya memerlukan refactoring agar dapat berfungsi dengan ImageMagick versi 7. Berikut ilustrasinya. Mari kita refactor secara naif cuplikan kode versi 6 di atas agar berfungsi dengan API ImageMagick versi 7:
for (y=0; y < (ssize_t) image->rows; y++)
{
Quantum
*q;
q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
if (q == (Quantum *) NULL)
{
status=MagickFalse;
continue;
}
for (x=0; x < (ssize_t) image->columns; x++)
{
if ((GetPixelRedTraits(image) & UpdatePixelTrait) != 0)
SetPixelRed(image,QuantumRange-GetPixelRed(image,q),q);
if ((GetPixelGreenTraits(image) & UpdatePixelTrait) != 0)
SetPixelGreen(image,QuantumRange-GetPixelGreen(image,q),q);
if ((GetPixelBlueTraits(image) & UpdatePixelTrait) != 0)
SetPixelBlue(image,QuantumRange-GetPixelBlue(image,q),q);
if ((GetPixelBlackTraits(image) & UpdatePixelTrait) != 0)
SetPixelBlack(image,QuantumRange-GetPixelBlack(image,q),q);
if ((GetPixelAlphaTraits(image) & UpdatePixelTrait) != 0)
SetPixelAlpha(image,QuantumRange-GetPixelAlpha(image,q),q);
q+=GetPixelChannels(image);
}
if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
status=MagickFalse;
}
Mari kita lakukan sekali lagi, tetapi kali ini memanfaatkan sepenuhnya dukungan kanal piksel variabel yang baru:
for (y=0; y < (ssize_t) image->rows; y++)
{
Quantum
*q;
q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
if (q == (Quantum *) NULL)
{
status=MagickFalse;
continue;
}
for (x = 0; x < (ssize_t) image->columns; x++)
{
ssize_t
i;
if (GetPixelWriteMask(image,q) <= (QuantumRange/2))
{
q+=GetPixelChannels(image);
continue;
}
for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
{
PixelChannel channel = GetPixelChannelChannel(image,i);
PixelTrait traits = GetPixelChannelTraits(image,channel);
if ((traits & UpdatePixelTrait) == 0)
continue;
q[i]=QuantumRange-q[i];
}
q+=GetPixelChannels(image);
}
if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
status=MagickFalse;
}
Perhatikan bagaimana kita menggunakan GetPixelChannels() untuk berpindah ke kumpulan kanal piksel berikutnya.
Indeks colormap dan kanal piksel hitam (untuk ruang warna CMYK) tidak lagi disimpan dalam kanal indeks yang sebelumnya diakses dengan GetAuthenticIndexQueue() dan GetCacheViewAuthenticIndexQueue(). Sebagai gantinya, keduanya kini menjadi kanal piksel kelas satu (first class) dan diakses sebagai anggota array piksel (misalnya pixel[4]) atau melalui metode aksesor piksel yang praktis, yaitu GetPixelIndex(), SetPixelIndex(), GetPixelBlack(), dan SetPixelBlack().
Sebagai konsekuensi dari penggunaan struktur array untuk kanal piksel variabel, kompiler dengan auto-vectorization memperoleh peluang tambahan untuk mempercepat loop piksel.
Kanal sync pada IMv6 sebenarnya adalah flag, bukan kanal. Pada IMv7, kami menggunakan flag: -define compose:sync=false.
Aksesor piksel
Anda dapat mengakses kanal piksel sebagai elemen array (misalnya pixel[1]) atau menggunakan aksesor praktis untuk mengambil atau menetapkan kanal piksel:
GetPixela() SetPixela()
GetPixelAlpha() SetPixelAlpha()
GetPixelb() SetPixelb()
GetPixelBlack() SetPixelBlack()
GetPixelBlue() SetPixelBlue()
GetPixelCb() SetPixelCb()
GetPixelCr() SetPixelCr()
GetPixelCyan() SetPixelCyan()
GetPixelGray() SetPixelGray()
GetPixelGreen() SetPixelGreen()
GetPixelIndex() SetPixelIndex()
GetPixelL() SetPixelL()
GetPixelMagenta() SetPixelMagenta()
GetPixelReadMask() SetPixelReadMask()
GetPixelWriteMask() SetPixelWriteMask()
GetPixelMetacontentExtent() SetPixelMetacontentExtent()
GetPixelOpacity() SetPixelOpacity()
GetPixelRed() SetPixelRed()
GetPixelYellow() SetPixelYellow()
GetPixelY() SetPixelY()
Anda dapat menemukan definisi aksesor-aksesor ini dalam file header, MagickCore/pixel-accessor.h
Sifat piksel
Setiap kanal piksel memiliki satu atau lebih sifat berikut:
- Undefined
- tidak ada sifat yang terkait dengan kanal piksel ini
- Copy
- jangan perbarui kanal piksel ini, cukup salin
- Update
- perbarui kanal piksel ini
- Blend
- padukan kanal piksel ini dengan mask alpha jika diaktifkan
Kami menyediakan metode-metode berikut untuk menetapkan dan mengambil sifat piksel:
GetPixelAlphaTraits() SetPixelAlphaTraits()
GetPixelBlackTraits() SetPixelBlackTraits()
GetPixelBlueTraits() SetPixelBlueTraits()
GetPixelCbTraits() SetPixelCbTraits()
GetPixelChannelTraits() SetPixelChannelTraits()
GetPixelCrTraits() SetPixelCrTraits()
GetPixelGrayTraits() SetPixelGrayTraits()
GetPixelGreenTraits() SetPixelGreenTraits()
GetPixelIndexTraits() SetPixelIndexTraits()
GetPixelMagentaTraits() SetPixelMagentaTraits()
GetPixelRedTraits() SetPixelRedTraits()
GetPixelYellowTraits() SetPixelYellowTraits()
GetPixelYTraits() SetPixelYTraits()
Untuk kepraktisan, Anda dapat menetapkan sifat aktif untuk sekumpulan kanal piksel menggunakan mask kanal dan metode berikut:
SetImageChannelMask()
Sebelumnya, metode MagickCore memiliki analog per-kanal, misalnya NegateImage() dan NegateImageChannels(). Metode analog per-kanal ini tidak lagi diperlukan karena sifat kanal piksel sudah menentukan apakah suatu operasi berlaku pada kanal piksel tertentu atau apakah harus dipadukan dengan mask alpha. Sebagai contoh, alih-alih menggunakan
NegateImageChannel(image,channel);
kami menggunakan:
channel_mask=SetImageChannelMask(image,channel);
NegateImage(image,exception);
(void) SetImageChannelMask(image,channel_mask);
Kanal piksel pengguna
Pada versi 7, kami memperkenalkan kanal piksel pengguna (user channel). Secara tradisional kami menggunakan 4 kanal, yaitu merah, hijau, biru, dan alpha. Untuk CMYK, ada tambahan kanal hitam. Kanal pengguna dirancang untuk menampung informasi kanal tambahan apa pun yang relevan bagi aplikasi Anda. Beberapa contohnya adalah kanal tambahan pada gambar TIFF atau PSD, atau mungkin Anda memerlukan kanal berisi informasi inframerah untuk setiap piksel. Anda dapat mengaitkan sifat dengan kanal pengguna sehingga, ketika dikenai algoritme pemrosesan gambar (misalnya blur), piksel tersebut disalin, diproses oleh algoritme, atau bahkan dipadukan dengan kanal alpha jika itu masuk akal.
Metakonten piksel
Pada versi 7, kami memperkenalkan metakonten piksel. Metakonten adalah konten tentang konten. Jadi, alih-alih menjadi konten itu sendiri, metakonten adalah sesuatu yang mendeskripsikan atau berasosiasi dengan konten tersebut. Di sini, konten yang dimaksud adalah sebuah piksel. Metakonten piksel sepenuhnya untuk penggunaan Anda sendiri (secara internal datanya hanya disalin, tidak dimodifikasi) dan diakses melalui metode-metode API MagickCore berikut:
SetImageMetacontentExtent()
GetImageMetacontentExtent()
GetVirtualMetacontent()
GetAuthenticMetacontent()
GetCacheViewAuthenticMetacontent()
GetCacheViewVirtualMetacontent()
Alpha
Kami kini mendukung alpha, yang sebelumnya berupa opacity. Dengan alpha, nilai 0 berarti piksel tersebut tidak memiliki informasi cakupan (coverage) dan bersifat transparent; artinya, tidak ada kontribusi warna dari geometri mana pun karena geometri tersebut tidak tumpang tindih dengan piksel ini. Nilai QuantumRange berarti piksel bersifat opaque karena geometri sepenuhnya menutupi piksel tersebut. Sebagai akibatnya, pada versi 7, anggota alpha pada struktur PixelInfo menggantikan anggota opacity sebelumnya. Konsekuensi lainnya, bagian alpha pada nilai sRGB dalam notasi heksadesimal kini terbalik (misalnya #0000 berarti sepenuhnya transparent).
Ruang warna
Ruang warna Rec601Luma dan Rec709Luma tidak lagi didukung. Sebagai gantinya, tentukan ruang warna gray dan pilih salah satu opsi intensity berikut:
Rec601Luma
Rec601Luminance
Rec709Luma
Rec709Luminance
Sebagai contoh,
magick myImage.png -intensity Rec709Luminance -colorspace gray myImage.jpg
Grayscale
Sebelumnya, gambar grayscale menggunakan Rec601Luminance dan memakan 4 kanal: merah, hijau, biru, dan alpha. Pada versi 7, grayscale hanya memakan 1 kanal sehingga jauh lebih hemat sumber daya.
Mask
Versi 7 mendukung mask untuk sebagian besar operator gambar. Piksel putih pada read mask mengabaikan piksel yang bersesuaian pada gambar, sedangkan piksel putih pada write mask melindungi piksel yang bersesuaian pada gambar. Dari baris perintah, Anda dapat mengaitkan mask dengan gambar melalui opsi -read-mask dan -write-mask. Polaritas ini sama dengan mask pada ImageMagick versi 6 agar memudahkan porting alur kerja Anda. Untuk kepraktisan, kami tetap mendukung opsi -mask pada versi 7 agar sesuai dengan perilaku versi 6.
Pada contoh ini, kita menghitung distorsi dari gambar hasil rekonstruksi yang telah diberi mask:
compare -metric rmse -read-mask hat_mask.png hat.png wizard.png difference.png
Di sini kita melindungi piksel tertentu dari perubahan:
magick rose: -write-mask rose_bg_mask.png -modulate 110,100,33.3 +write-mask rose_blue.png
Mask yang dikaitkan dengan gambar akan bertahan hingga dimodifikasi atau dihapus. Hal ini dapat menghasilkan hasil yang tidak terduga pada baris perintah yang kompleks. Di sini kita hanya ingin melakukan clip saat menerapkan opsi alpha, bukan saat resize:
magick -density 300 -colorspace srgb image.eps -alpha transparent -clip -alpha opaque +clip -resize 1000x1000 -strip image.png
MagickCore API
Berikut adalah daftar perubahan pada API MagickCore:
- Hampir semua algoritme pemrosesan gambar kini menyadari kanal (channel aware).
- API MagickCore menambahkan argumen ExceptionInfo pada metode-metode yang sebelumnya tidak memilikinya di versi 6, misalnya NegateImage(image,MagickTrue,exception)
- Semua metode analog per-kanal telah dihapus (misalnya BlurImageChannel()); metode ini tidak lagi diperlukan, gunakan sifat piksel (pixel traits) sebagai gantinya.
- Pemanggilan API publik dan privat kini dideklarasikan dengan atribut visibility GCC. Pustaka dinamis MagickCore dan MagickWand kini hanya mengekspor deklarasi struct dan fungsi publik.
- Enum InterpolatePixelMethod kini menjadi PixelInterpolateMethod.
- Tipe penyimpanan IntegerPixel dihapus (gunakan LongPixel sebagai gantinya) dan LongLongPixel ditambahkan
- Signature gambar berubah untuk mengakomodasi kanal piksel variabel.
- Semua struktur paket warna, PixelPacket, LongPacket, dan DoublePacket, digabungkan menjadi satu struktur warna tunggal, PixelInfo.
- Anggota I pada struktur ChannelMoments kini bersifat invariant. I berkonflik dengan header complex.h.
- Kami menambahkan parameter length pada FormatMagickSize() untuk mengizinkan buffer dengan panjang variabel.
MagickWand API
Berikut adalah daftar perubahan pada API MagickWand:
- Hampir semua algoritme pemrosesan gambar kini menyadari kanal (channel aware).
- Metode DrawMatte() kini disebut DrawAlpha().
- Metode MagickSetImageBias() dan MagickSetImageClipMask() tidak lagi didukung.
Magick++ API
Berikut adalah daftar perubahan pada API Magick++:
- Hampir semua algoritme pemrosesan gambar kini menyadari kanal (channel aware).
- Gunakan konstruksi berikut, misalnya, untuk menghindari operasi pada kanal alpha:
image.negateChannel(Magick::ChannelType(Magick::CompositeChannels ^ Magick::AlphaChannel));
File header
Versi ImageMagick sebelumnya (4-6) merujuk file header ImageMagick sebagai magick/ dan wand/. ImageMagick 7 sebagai gantinya menggunakan MagickCore/ dan MagickWand/. Sebagai contoh,
#include <MagickCore/MagickCore.h>
#include <MagickWand/MagickWand.h>
Fitur usang yang dihapus
Semua fitur usang dari ImageMagick versi 6 dihapus pada versi 7. Ini termasuk utilitas konfigurasi Magick-config dan Wand-config. Sebagai gantinya, gunakan:
MagickCore-config
MagickWand-config
Metode FilterImage() telah dihapus. Gunakan ConvolveImage() sebagai gantinya.
Selain itu, semua metode MagickCore dan MagickWand yang sudah usang tidak lagi tersedia pada versi 7.
Filter Bessel dihapus karena merupakan alias dari Jinc. Gunakan -filter Jinc sebagai gantinya.
Shell API atau antarmuka baris perintah
Seperti disebutkan, fokus utama perubahan pada Shell API atau Command Line Interface adalah abstraksi, sehingga opsi tidak hanya dapat dibaca dari argumen baris perintah, tetapi juga dari file (skrip) atau dari file stream (perintah interaktif, atau co-processing).
Untuk melakukan ini, parser CLI perlu ditulis ulang, sehingga semua opsi selalu dijalankan dalam urutan ketat "sesuai urutan yang terlihat" (do-it-as-you-see-it). Sebelumnya pada IMv6, opsi dijalankan secara berkelompok (dikenal sebagai 'FireOptions), dan kejanggalan ini kini telah hilang. Namun, urutan ketat ini berarti Anda tidak dapat lagi memberikan operasi sebelum menyediakan gambar untuk dioperasikan. Melakukan hal itu kini akan menghasilkan error.
Pelaporan error kini melaporkan secara persis opsi mana (berdasarkan hitungan argumen pada baris perintah, atau baris,kolom pada skrip) yang menyebabkan 'exception' tersebut. Ini belum sepenuhnya lengkap, tetapi terus membaik. Belum lengkap pula penanganan 'regard-warnings' atau penggantinya, yang akan memungkinkan Anda mengabaikan error yang dilaporkan dan melanjutkan pemrosesan (sesuai kebutuhan akibat error tersebut) dalam co-process atau penggunaan interaktif.
Dengan parser IMv7, yang diaktifkan oleh utilitas magick, pengaturan diterapkan secara berurutan pada setiap gambar dalam memori (jika ada). Sementara option: hanya perlu diterapkan sekali secara global. Menggunakan utilitas lain secara langsung, atau sebagai argumen untuk CLI magick (misalnya magick), akan menggunakan parser lama (legacy).
Opsi tanda kurung yang dahulu digunakan untuk 'push' daftar gambar saat ini dan pengaturan gambar (contoh: '(' dan ')') ke sebuah stack, kini memiliki stack pengaturan gambar yang sepenuhnya terpisah. Artinya, tanda kurung akan 'push/pull' daftar gambar, sedangkan kurung kurawal (contoh: '{' dan '}') akan 'push/pull' pengaturan gambar.
Tentu saja, akibat perubahan pada penanganan kanal yang mendasarinya seperti telah disebutkan sebelumnya, akan muncul banyak efek samping pada hampir semua opsi. Berikut beberapa contoh spesifiknya
Sebagian besar algoritme memperbarui kanal merah, hijau, biru, hitam (untuk CMYK), dan alpha. Sebagian besar operator akan memadukan alpha dengan kanal warna lainnya, tetapi operator (dan situasi) lain mungkin memerlukan pemaduan ini dinonaktifkan, yang saat ini dilakukan dengan menghapus alpha dari kanal aktif melalui opsi -channel (misalnya magick castle.gif -channel RGB -negate castle.png).
Membaca gambar grayscale menghasilkan gambar dengan hanya satu kanal. Jika gambar tersebut nantinya perlu menerima warna, pengaturan -colorspace perlu diterapkan untuk memperluas satu kanal tersebut menjadi kanal-kanal RGB (atau lainnya) yang terpisah.
Sebelumnya, argumen baris perintah dibatasi hingga 4096 karakter; dengan ImageMagick versi 7, batas ini meningkat menjadi 131072 karakter.
Perubahan perintah
Berikut adalah daftar perubahan pada perintah-perintah ImageMagick:
- magick
- PENTING: Perintah " magick" adalah perintah utama baru pada Shell API, menggantikan perintah lama "convert". Ini memungkinkan Anda membuat 'skrip magick' berbentuk "#!/path/to/command/magick -script", atau meng-pipe opsi ke dalam perintah "magick -script -, sebagai proses latar belakang.
- magick-script
- Perintah ini sama seperti "magick", (hanya nama perintahnya yang berbeda) tetapi memiliki opsi implisit "-script". Ini memungkinkan Anda menggunakannya dalam bentuk skrip gaya "env". Artinya, skrip magick dimulai dengan baris 'she-bang' "#!/usr/bin/env magick-script" sehingga interpreter skrip dapat ditemukan di mana pun pada "PATH" perintah pengguna. Ini diperlukan untuk mengatasi "bug she-bang satu argumen" yang umum terjadi pada sebagian besar sistem UNIX (termasuk Linux, tetapi tidak MacOSX).
- animate, compare, composite, conjure, convert, display, identify, import, mogrify, montage, stream
- Untuk mengurangi footprint utilitas baris perintah, utilitas-utilitas ini merupakan symbolic link ke utilitas magick. Pada Windows, utilitas-utilitas ini diinstal sebagai executable terpisah dan executable convert lama tidak lagi disertakan. Anda juga dapat memanggilnya dari utilitas magick, misalnya gunakan magick logo: logo.png untuk memanggil utilitas magick. (Dengan kata lain, panggil utilitas-utilitas ini dengan mengawalinya dengan magick, seperti magick compare, magick identify, magick mogrify, magick montage, dan seterusnya. Jangan gunakan magick convert. Itu sederhananya cukup magick)
Perubahan perilaku
Pengaturan gambar diterapkan pada setiap gambar di baris perintah. Untuk mengaitkan pengaturan dengan gambar tertentu, gunakan tanda kurung untuk menghilangkan ambiguitas. Pada contoh ini, kita memberikan offset halaman yang unik untuk setiap gambar:
magick \( -page +10+20 first.png \) \( -page +100+200 second.png \) ...
Secara default, operasi gambar seperti convolution memadukan alpha dengan setiap kanal. Untuk melakukan convolve pada setiap kanal secara independen, nonaktifkan kanal alpha sebagai berikut:
magick ... -alpha discrete -blur 0x1 ...
Untuk menghapus nilai alpha dari gambar Anda, gunakan -alpha off. Jika Anda sebaliknya ingin mempertahankan kanal alpha tetapi tidak memadukan piksel alpha untuk operasi pemrosesan gambar tertentu, gunakan -alpha deactivate sebagai gantinya.
Beberapa opsi berubah pada ImageMagick versi 7. Di antaranya:
- -channel
- default-nya adalah memperbarui kanal RGBA; sebelumnya, pada IMv6, default-nya adalah RGB. Jika Anda mendapatkan hasil yang berbeda dari IMv6, Anda mungkin perlu menentukan -channel RGB pada baris perintah Anda (misalnya -channel RGB -negate).
- +combine
- Opsi ini kini memerlukan argumen, yaitu ruang warna gambar (misalnya +combine sRGB).
- -format
- Properti gambar %Z tidak lagi didukung.
- -gamma
- Beberapa argumen gamma sekaligus (misalnya -gamma 1,2,3) tidak lagi didukung, sebagai gantinya gunakan -channel (misalnya -channel blue -gamma 2).
- -region
- Opsi ini menetapkan write mask untuk region yang Anda tentukan. Pada IMv6, sebagai gantinya sebuah gambar terpisah di-clone, dioperasikan, lalu hasilnya di-composite ke gambar sumber. Selain itu, transformasi draw kini relatif terhadap sudut kiri atas gambar, sebelumnya pada IMv6 transformasi tersebut relatif terhadap region.
Gunakan -define morphology:showKernel=1 untuk menampilkan kernel morfologi atau convolution. Sebelumnya, ini adalah -define showKernel=1.
Opsi baru
ImageMagick versi 7 mendukung opsi-opsi baru berikut, meskipun sebagian besar terbatas pada perintah "magick", atau untuk digunakan dalam skrip "magick".
- { ... }
- Menyimpan (dan memulihkan) pengaturan gambar saat ini (secara internal dikenal sebagai struktur "image_info"). Ini dilakukan secara otomatis dengan tanda kurung (contoh: '(' dan ')') jika "-regard-parenthesis" telah ditetapkan, sama seperti pada IMv6. Kehati-hatian disarankan untuk mencegah error kurung kurawal yang tidak seimbang.
- --
- Akhir opsi, digunakan pada perintah IMv7 "mogrify" untuk secara eksplisit memisahkan operasi yang akan diterapkan dari gambar yang akan diproses 'in-place'. (belum diimplementasikan). Namun jika tidak disediakan, "-read" masih dapat digunakan untuk membedakan pembacaan gambar sekunder (untuk hal-hal seperti alpha composition) dari gambar 'in-place' yang sedang diproses. Pada perintah lain (seperti "magick") ini setara dengan "-read" eksplisit (lihat di bawah) terhadap opsi berikutnya sebagai sebuah gambar (seperti pada IMv6).
- -alpha activate/deactivate
- masing-masing mengaktifkan dan menonaktifkan kanal alpha, secara persisten. Ini mirip dengan on/off pada Imagemagick 6. Pada Imagemagick 7, -alpha off akan menghapus kanal alpha secara permanen sehingga -alpha on tidak akan mengaktifkannya kembali.
- -alpha discrete
- memperlakukan kanal alpha secara independen (tidak dipadukan).
-channel-fx expression
menukar, mengekstrak, atau menyalin satu atau lebih kanal gambar.
Ekspresi ini terdiri dari satu atau lebih kanal, baik dalam bentuk mnemonic maupun numerik (misalnya red atau 0, green atau 1, dst.), dipisahkan oleh simbol operasi tertentu sebagai berikut:
<=> menukar dua kanal (misalnya red<=>blue)
=> menyalin satu kanal ke kanal lain (misalnya red=>green)
= memberikan nilai konstan ke sebuah kanal (misalnya red=50%)
, menulis gambar baru dengan kanal sesuai urutan yang ditentukan (misalnya red, green)
; menambahkan gambar keluaran baru untuk kumpulan operasi kanal berikutnya (misalnya red; green; blue)
| berpindah ke gambar masukan berikutnya sebagai sumber data kanal (misalnya | gray=>alpha)
Sebagai contoh, untuk membuat 3 gambar grayscale dari kanal merah, hijau, dan biru sebuah gambar, gunakan:
-channel-fx "red; green; blue"
Kanal tanpa simbol operasi berarti separate (yaitu titik koma).
Di sini kita mengambil gambar sRGB dan gambar grayscale, lalu menyisipkan gambar grayscale tersebut ke dalam kanal alpha:
magick wizard.png mask.pgm -channel-fx '| gray=>alpha' wizard-alpha.png
Gunakan perintah serupa untuk mendefinisikan read mask:
magick wizard.png mask.pgm -channel-fx '| gray=>read-mask' wizard-mask.png
Tambahkan -debug pixel sebelum opsi -channel-fx untuk melacak morfologi kanal.
- -exit
- Menghentikan pemrosesan pada titik ini. Tidak ada opsi lain yang akan diproses setelah opsi ini. Dapat digunakan dalam skrip untuk memaksa perintah "magick" keluar, tanpa benar-benar menutup pipeline tempat opsi-opsinya diproses. Juga dapat digunakan sebagai opsi 'final' pada baris perintah "magick", menggantikan gambar keluaran implisit, untuk sepenuhnya mencegah penulisan gambar apa pun. CATATAN: bahkan coder "NULL:" memerlukan setidaknya satu gambar agar dapat 'tidak menulis'! Opsi ini sama sekali tidak memerlukan gambar apa pun.
- -read
- Pembacaan gambar secara eksplisit, bukan pembacaan implisit. Ini memungkinkan Anda membaca dari nama file yang diawali dengan karakter 'opsi', yang jika tidak, dapat salah dikenali sebagai opsi (baik yang dikenal maupun tidak). Fitur ini pada akhirnya akan digunakan pada "mogrify" untuk memungkinkan pembacaan gambar sekunder, serta penggunaan operasi daftar gambar di dalam perintah tersebut.
- -read-mask
- mencegah pembaruan piksel gambar yang ditentukan oleh mask
- -region
- didukung pada ImageMagick 7.0.2-6 dan versi setelahnya
- -script
- Pada "magick", menghentikan pemrosesan argumen baris perintah sebagai operasi gambar, dan membaca semua opsi selanjutnya dari file atau pipeline yang diberikan.
- -write-mask
- mencegah piksel ditulis.
Opsi yang berubah
Opsi-opsi berikut diketahui telah berubah dalam beberapa hal.
- -bias
- Opsi ini tidak lagi dikenali. Gunakan -define convolve:bias=value sebagai gantinya.
- -draw
- Primitif matte kini menjadi alpha (misalnya -draw 'alpha 0,0 floodfill').
- -negate
- saat ini membalikkan (negate) semua kanal, termasuk alpha jika ada. Karena itu, Anda mungkin perlu menggunakan opsi -channel untuk mencegah negasi alpha (misalnya -channel RGB -negate).
- -preview
- opsi ini kini menjadi operator gambar. Format gambar PREVIEW telah dihapus.
Peringatan usang diberikan, tetapi tetap berfungsi (untuk saat ini)
- -affine
- Digantikan oleh -draw "affine ...". (lihat transform)
- -average
- Digantikan oleh -evaluate-sequence Mean.
- -box
- Digantikan oleh -undercolor.
- -deconstruct
- Digantikan oleh -layers CompareAny.
- -gaussian
- Digantikan oleh -gaussian-blur.
- -/+map
- Digantikan oleh -/+remap.
- -/+mask
- Digantikan oleh -/+read-mask, -/+write-mask.
- -/+matte
- Digantikan oleh -alpha Set/Off.
- -transform
- Digantikan oleh -distort Affine "...".
Peringatan usang diberikan, dan diabaikan (untuk saat ini)
Hampir semua opsi 'plus' (+) yang sebelumnya tidak melakukan apa pun kini ditandai sebagai usang, dan memang tidak melakukan apa pun. Bahkan tidak ada kode terkait untuknya. Misalnya "+annotate", "+resize", "+clut", dan "+draw" .
- -affinity
- Digantikan oleh -remap.
- -maximum
- Digantikan oleh -evaluate-sequence Max.
- -median
- Digantikan oleh -evaluate-sequence Median.
- -minimum
- Digantikan oleh -evaluate-sequence Min.
- -recolor
- Digantikan oleh -color-matrix.
Opsi yang dihapus / diganti (error "no such option" dan dibatalkan)
- -interpolate filter
- menghapus metode interpolasi yang lambat dan tidak berguna
- -origin
- opsi lama, makna tidak diketahui.
- -pen
- Digantikan oleh -fill.
- -passphrase
- opsi lama, makna tidak diketahui
Peningkatan performa
Pengoperasian pada gambar grayscale meningkat secara signifikan karena hanya memerlukan satu kanal. Sebelumnya, grayscale memerlukan tiga kanal.
Performa opsi -fx meningkat satu hingga dua orde besaran.
Ringkasan perubahan versi 7
Perubahan dari ImageMagick versi 6 ke versi 7 dirangkum di sini:
Pencitraan rentang dinamis tinggi
- ImageMagick versi 7 mengaktifkan HDRI secara default. Anda dapat mengharapkan hasil pemrosesan gambar yang lebih akurat, dengan kebutuhan memori yang lebih tinggi dan kemungkinan waktu pemrosesan yang lebih lambat. Anda dapat menonaktifkan fitur ini pada sistem dengan sumber daya terbatas seperti ponsel, dengan sedikit penurunan akurasi untuk algoritme tertentu (misalnya resizing).
Piksel
- Piksel tidak lagi dialamatkan melalui anggota struktur PixelPacket (misalnya red, green, blue, opacity), melainkan sebagai array kanal (misalnya pixel[PixelRedChannel]).
- Gunakan makro praktis untuk mengakses kanal piksel (misalnya GetPixelRed(), SetPixelRed()).
- Kanal hitam untuk ruang warna CMYK tidak lagi disimpan dalam kanal indeks yang sebelumnya diakses dengan GetAuthenticIndexQueue() dan GetCacheViewAuthenticIndexQueue(). Sebagai gantinya, kini menjadi kanal piksel dan diakses dengan makro piksel praktis GetPixelBlack() dan SetPixelBlack().
- Kanal indeks untuk gambar colormapped tidak lagi disimpan dalam kanal indeks yang sebelumnya diakses dengan GetAuthenticIndexQueue() dan GetCacheViewAuthenticIndexQueue(). Sebagai gantinya, kini menjadi kanal piksel dan diakses dengan makro piksel praktis GetPixelIndex() dan SetPixelIndex().
- Gunakan GetPixelChannels() untuk berpindah ke kumpulan kanal piksel berikutnya.
- Gunakan kanal metakonten untuk mengaitkan metakonten dengan setiap piksel.
- Semua struktur paket warna, PixelPacket, LongPacket, dan DoublePacket, digabungkan menjadi satu struktur warna tunggal, PixelInfo.
Alpha
- Kami mendukung alpha, bukan opacity (0 transparent; QuantumRange opaque).
- Gunakan GetPixelAlpha() atau SetPixelAlpha() untuk mengambil atau menetapkan nilai kanal piksel alpha.
Grayscale
- Gambar grayscale memakan satu kanal piksel pada ImageMagick versi 7. Untuk memproses RGB, tetapkan colorspace ke RGB (misalnya -colorspace sRGB).
Mask
- ImageMagick versi 6 hanya mendukung read mask dalam situasi terbatas. Versi 7 mendukung baik read mask maupun write mask. Read mask dihormati oleh sebagian besar algoritme pemrosesan gambar.
MagickCore API
- Hampir semua algoritme pemrosesan gambar kini menyadari kanal (channel aware).
- MagickCore, versi 7, menambahkan argumen ExceptionInfo pada metode-metode yang sebelumnya tidak memilikinya di versi 6, misalnya NegateImage(image,MagickTrue,exception);
- Semua metode analog per-kanal telah dihapus (misalnya BlurImageChannel()), metode ini tidak lagi diperlukan, gunakan sifat piksel sebagai gantinya.
- Pemanggilan API publik dan privat kini dideklarasikan dengan atribut visibility GCC. Pustaka dinamis MagickCore dan MagickWand kini hanya mengekspor deklarasi struct dan fungsi publik.
- Enum InterpolatePixelMethod kini menjadi PixelInterpolateMethod.
- Untuk mengakomodasi kanal piksel variabel, gambar kini dapat mengembalikan signature yang berbeda.
Metode usang
- Semua metode MagickCore dan MagickWand yang usang pada ImageMagick versi 6 dihapus dan tidak lagi tersedia pada ImageMagick versi 7.
- Semua metode analog per-kanal MagickCore dihapus (misalnya NegateImageChannels()). Untuk versi 7, gunakan sifat piksel sebagai gantinya.
- Metode FilterImage() telah dihapus. Gunakan ConvolveImage() sebagai gantinya.