Pertanyaan Bagaimana cara menghentikan GD2 dari membasuh warna saat mengubah ukuran gambar?


Saya telah mengembangkan situs komunitas berbagi foto menggunakan CodeIgniter 1.7. Foto yang diunggah oleh anggota secara otomatis diubah ukurannya dalam sejumlah format, yang saya gunakan kelas Manipulasi Gambar Codeigniter. Kelas ini dibangun ke dalam kerangka dan pada dasarnya pembungkus di sekitar beberapa perpustakaan manipulasi gambar, seperti GD, GD2, ImageMagick, dan NETPBM. Pada host saya, saya hanya dapat menggunakan GD2, jadi di sanalah pertanyaan ini akan menjadi.

Ke masalah saya. Berikut ini contoh foto yang diubah ukurannya di situs saya. Perhatikan bahwa aslinya sangat besar, lebih dari 3000px lebar:

http://www.jungledragon.com/image/195/female_impala_close-up.html

Sekarang, lihat gambar yang sama, juga diubah ukurannya, hanya sedikit lebih besar di Flickr:

http://www.flickr.com/photos/fledder/3763538865/in/set-72157621744113979

Lihat perbedaan dramatisnya? Saya mencoba menjembatani celah besar itu. Hal pertama yang saya lakukan adalah menerapkan filter penajam pada gambar. Anda dapat melihat hasilnya di sini:

enter image description here

Meski masih belum sempurna, setidaknya mendekati tingkat ketajaman gambar Flickr. Masalah yang tersisa adalah warnanya tersapu habis, seolah-olah saturasinya menurun. Ini terjadi sebelum filter penajaman sudah, jadi harus di GD2.

Masalah ini sangat penting bagi saya, tetapi saya tidak tahu di mana mencarinya. Saya telah menemukan beberapa. Benang NET berbicara tentang kroma sub sampling tetapi saya tidak tahu apa yang harus dilakukan dengan informasi tersebut di setup saya. Saya mencari solusi apa pun yang bekerja dalam batasan pengaturan saya.

Memperbarui: Dengan ini file asli, persis seperti yang saya unggah ke situs saya dan Flickr:

http://www.jungledragon.com/img/DSC07275.jpg

Perbarui 2: Saya terkejut. Dengan cara yang baik. Butuh banyak rasa sakit untuk menginstal ImageMagick tetapi setelah beralih ke itu (yang merupakan masalah pengaturan 'imagemagick' sebagai perpustakaan untuk digunakan di kelas manipulasi gambar Igniter Kode, hasil gambar uji adalah sebagai berikut:

enter image description here

Mengubah ukuran ImageMagick adalah melakukan persis seperti yang dimaksudkan. Warna-warna dipertahankan, dan ketajaman ada di sana. Ya, saya menonaktifkan rutin mengasah kebiasaan saya karena tidak lagi diperlukan karena ImageMagick. Di atas itu, prosesnya jauh lebih cepat dan juga kurang haus memori. Dan inilah bagian besar lainnya: Saya tidak bisa menjelaskannya, tetapi saya sama sekali tidak memberi tahu ImageMagick untuk menggunakan profil warna tertentu, yang disarankan oleh pengguna @Alix. Dalam pengujian saya sejauh ini sepertinya informasi warna dihormati dengan atau tanpa profil yang disematkan. Outputnya hanya merupakan versi lebih kecil dari input. Apakah ImageMagick benar-benar pintar atau saya sedang bermimpi?


32
2018-04-24 20:25


asal


Jawaban:


Saya telah berhasil menguji lebih lanjut ini dengan Imagick:

Imagick sRGB Test

Setengah bagian kiri gambar diproses dengan Imagick dan sRGB_IEC61966-2-1_no_black_scaling.icc profil warna, setengah kanan tidak memiliki profil warna yang terkait dan menunjukkan persis sama jika diproses dengan Imagick atau GD; di sini adalah kode yang saya gunakan:

header('Content-type: image/jpeg');

$image = new Imagick('/path/to/DSC07275.jpg');

if (($srgb = file_get_contents('http://www.color.org/sRGB_IEC61966-2-1_no_black_scaling.icc')) !== false)
{
    $image->profileImage('icc', $srgb);
    $image->setImageColorSpace(Imagick::COLORSPACE_SRGB);
}

$image->thumbnailImage(1024, 0);

echo $image;

Berikut ini adalah perbandingan dari beberapa profil sRGB yang tersedia di situs web color.org:

sRGB Comparison

Tampaknya bagi saya bahwa profil ketiga menghasilkan hasil yang paling jelas, selain itu saya tidak tahu bagaimana orang akan membuat pilihan yang pasti.


EDIT: Rupanya, Imagick hadir dengan profil sRGB yang dibundel, sehingga Anda tidak perlu mengunduh yang dari situs web Konsorsium Warna Gambar, kode berikut harus menangani semua skenario:

header('Content-type: image/jpeg');

$image = new Imagick('/path/to/DSC07275.jpg');
$version = $image->getVersion();
$profile = 'http://www.color.org/sRGB_IEC61966-2-1_no_black_scaling.icc';

if ((is_array($version) === true) && (array_key_exists('versionString', $version) === true))
{
    $version = preg_replace('~ImageMagick ([^-]*).*~', '$1', $version['versionString']);

    if (is_file(sprintf('/usr/share/ImageMagick-%s/config/sRGB.icm', $version)) === true)
    {
        $profile = sprintf('/usr/share/ImageMagick-%s/config/sRGB.icm', $version);
    }
}

if (($srgb = file_get_contents($profile)) !== false)
{
    $image->profileImage('icc', $srgb);
    $image->setImageColorSpace(Imagick::COLORSPACE_SRGB);
}

$image->thumbnailImage(1024, 0);

echo $image;

24
2018-04-25 03:57



Gambar asli Anda memiliki Adobe RGB (1998) Profil ICC terlampir. Saya pikir GD, tidak mengetahui tentang profil, menafsirkan data gambar dengan tidak benar. Ini a bug PHP terkait mengkonfirmasikan ini.

Anda perlu mempersiapkan gambar dengan profil yang benar, kemungkinan besar sRGB. Jika Anda memiliki aplikasi yang dapat melakukan itu, cobalah mengonversinya ke sRGB dan unggah kembali.

Jika Anda memerlukan solusi sisi server permanen untuk masalah ini, saya pikir Anda akan membutuhkan perpustakaan pengolahan gambar yang dapat menangani profil. Sejujurnya, saya tidak tahu bagaimana ImageMagick berurusan dengan hal-hal ini, tetapi setidaknya itu akrab dengan konsep dasar profil warna.

Terkait: Perbandingan sRGB dan Adobe RGB


6
2018-04-24 20:48



Saya memiliki sedikit info untuk berkontribusi pada utas ini. Saya seorang fotografer dan bukan seorang pengembang web sehingga pengetahuan teknis saya tidak bagus, namun, saya telah berurusan dengan masalah ini jadi saya berharap posting ini akan membantu orang lain di telepon.

Saya menggunakan alat penjualan foto online yang mengubah semua gambar saya menggunakan GD. Saya mengalami masalah dengan gambar yang terlihat cara yang funky bahkan ketika diunggah dengan konversi sRGB yang tepat dan profil ICC yang dilampirkan, saat melihat di monitor lebar-lebar saya.

Yang saya temukan masalahnya adalah bahwa GD menghapus semua metadata dan profil ICC dari file asli. Kemudian browser, tidak melihat profil apa pun, tidak menampilkannya dengan benar. Ini sedikit pada monitor standar-gamut tetapi sangat jelas di lebar-gamut.

Jika Anda mengalami masalah dengan ini, Anda dapat menguji teori saya dengan menggunakan Firefox dan mengubah pengaturan di about: config. Ubah nilai "gfx.color_management.mode" dari default "2" menjadi "1". Pengaturan ini akan memaksa Firefox menganggap gambar apa pun tanpa profil ICC adalah sRGB dan akan menampilkannya seperti itu. Gambar harus muncul seperti yang Anda harapkan dan identik dengan Photoshop / Lightroom / etc. Mengapa semua browser tidak menggunakan pendekatan yang masuk akal ini karena standarnya di luar saya.

Sayangnya, keranjang belanja saya hanya disetel untuk menggunakan GD PHP sehingga saya tidak dapat memperoleh hasil yang baik saat ini. Saya benar-benar ingin melihat GD diperbarui untuk meninggalkan profil ICC terlampir atau memiliki opsi untuk menambahkan profil sRGB sederhana pada ekspor.

Info lebih lanjut di sini: http://www.gballard.net/psd/go_live_page_profile/embeddedJPEGprofiles.html#


4
2017-12-10 08:06



Saya telah menemukan skrip ini:

https://github.com/slavicv/jpeg-icc/blob/master/class.jpeg_icc.php

Script ini menyalin profil warna dari gambar asli Anda ke gambar baru Anda. Jadi setelah mengubah ukuran, Anda dapat menambahkan profil warna dari gambar asli Anda. Skrip ini tidak membutuhkan Imagick untuk melakukan trik.


2
2018-05-04 14:34