Обработка PNG БЕЗ Image Magick и imagefrompng ()

Мне нужно изменить каждый оттенок от желтого до синего и каждый оттенок от темно-серого до светло-серого в изображениях 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?

0

Решение

Если вы не возражаете против использования Python, посмотрите подушка, конкретно его PixelAccess учебный класс. Эти темы (1, 2) должен быть полезным и иметь несколько примеров кода.

0

Другие решения

Способ 1

Если вы просто хотите получить необработанные значения пикселей 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

Способ 2

В качестве альтернативы, если вы хотите, чтобы ваши данные были несжатыми, удобочитаемыми 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,

Способ 3

Как предлагает Гленн в комментариях, другой вариант — опустить -compress none в варианте 2, который даст вам очень похожий формат файла, за исключением того, что пиксельные данные будут в двоичном формате, после заголовка, который остается в ASCII. Это обычно быстрее и меньше.

0

По вопросам рекламы [email protected]