Мне нужно изменить каждый оттенок от желтого до синего и каждый оттенок от темно-серого до светло-серого в изображениях PNG с прозрачностью.
Проблема в:
Я не могу использовать Photoshop, потому что у меня есть 100 изображений, и мне нужно много раз менять оттенки.
Я не могу использовать Image Magick, потому что мне нужны более сложные вычисления, чем «-fx».
Я не могу использовать PHP imagefrompng (), потому что эта неприятная чушь не работает со многими моими изображениями,
даже со всеми предлагаемыми исправлениями, такими как:
$background = imagecolorallocate($png, 255, 255, 255);
// removing the black from the placeholder
imagecolortransparent($png, $background);
// turning off alpha blending (to ensure alpha channel information is preserved, rather than removed (blending with the rest of the image in the form of black))
imagealphablending($png, true);
// turning on alpha channel information saving (to ensure the full range of transparency is preserved)
imagesavealpha($png, true);
и так далее. Это работает с некоторыми изображениями, но не с другими.
Все, что мне нужно, это библиотека PNG (возможно, не в PHP), которая может дать мне красный, зеленый, синий и альфа-компонент пикселя с координатами x, y, а затем установить этот пиксель после моих вычислений, например:
$rgba = getrgba($image, $x, $y);
$rgba = my_function($rgba);
setrgba($image, $x, $y, $rgba);
Может быть, вы можете предложить библиотеки на других языках, не только PHP?
Если вы не возражаете против использования Python, посмотрите подушка, конкретно его PixelAccess учебный класс. Эти темы (1, 2) должен быть полезным и иметь несколько примеров кода.
Если вы просто хотите получить необработанные значения пикселей R, G, B и Alpha, не заботясь о сжатии и кодировании, используйте ImageMagick преобразовать ваше изображение в простой, несжатый, незашифрованный двоичный файл, прочитать его и обработать так, как вам хочется.
Итак, если мы создадим PNG-файл размером 1×1 пиксель с RGBA (0,64,255,0.5) для проверки:
convert -size 1x1 xc:"rgba(0,64,255,0.5)" a.png
Теперь мы можем получить ImageMagick чтобы создать необработанный RGBA-файл, который вы можете читать и обрабатывать по своему усмотрению на любом языке по своему желанию на любом уровне сложности, который пожелаете:
convert a.png rgba:data.bin
и теперь мы можем посмотреть в этом файле:
xxd data.bin
Результат
0000000: 0040 ff80 .@..
Там вы можете увидеть и прочитать все пиксели RGBA. Когда вы закончите, просто сделайте обратное, чтобы получить PNG — обратите внимание, что вы должны сказать ImageMagick размер первый, так как он не может знать это:
convert -size 1x1 rgba:data.bin new.png
Обратите внимание, что ImageMagick достаточно большой пакет для установки, и вы можете добиться почти того же, что и выше, с гораздо более легким весом vips
пакет:
vips VipsForeignSaveRaw a.png data.rgb
В качестве альтернативы, если вы хотите, чтобы ваши данные были несжатыми, удобочитаемыми ASCII, используйте почтенные форматы NetPBM: PPM
(Портативный Pixmap) и PGM
(Портативный Greymap) — см. NetPBM в Википедии.
Сделайте изображение 4х1 и напишите как PPM:
convert -size 4x1 xc:"rgba(0,64,255,0.1)" -compress none ppm:-
P3
4 1
65535
0 16448 65535 0 16448 65535 0 16448 65535 0 16448 65535
Вы можете увидеть 4 повторных значения RGB там, мы надеемся. Если вы хотите это как файл, просто измените ppm:-
в конце с someFile.ppm
,
Сделайте то же самое изображение снова и извлеките альфа-канал в отдельный файл:
convert -size 4x1 xc:"rgba(0,64,255,0.1)" -alpha extract -compress none pgm:-
P2
4 1
65535
6554 6554 6554 6554
Надеюсь, вы можете увидеть это 6554
является 0.1
в масштабе 0-65535.
Если вы просто хотите 8-битные данные по любому из вышеперечисленных, добавьте в -depth 8
,
Как предлагает Гленн в комментариях, другой вариант — опустить -compress none
в варианте 2, который даст вам очень похожий формат файла, за исключением того, что пиксельные данные будут в двоичном формате, после заголовка, который остается в ASCII. Это обычно быстрее и меньше.