2016-10-25 5 views
0

Я использую PHP и ImageMagick для чтения цветов с края изображения.Координаты пикселя изображения

$x = 1; 
$y = 1; 
$pixel = $image->getImagePixelColor($x, $y); 
$colors = $pixel->getColor(); // rgba 

Но я не совсем понимаю, как работают координаты. Поэтому я создал этот 4px png.

enter image description here

1,1 дает rgba(0,30,255,0) вместо прозрачного пикселя. Кроме того, что, если я выберу большой диапазон пикселей?

+0

Согласно значению RGBA, которое вы возвращаете, вы действительно выбираете прозрачный пиксель. «A» обозначает альфа-канал, обычно используемый для непрозрачности. Значение 0 для «a» означает, что оно полностью прозрачно. –

+0

@ User5842 Правильно, но почему rgb синего '0,30,255'? – 3zzy

+0

Что произойдет, если вы попытаетесь установить этот пиксель со значением RGBA? Значение RGB все равно может быть '0,30,255', это просто означает _blue с opacity_ –

ответ

2

Самый простой способ понять это должен помнить, что, когда пиксель прозрачный, его цвет становится неактуальным, еще нет is сохранено.

Таким образом, если мы делаем непрозрачный 512x512 изображение случайного шума, как это:

convert -size 512x512 xc:gray +noise random a.png 

enter image description here

и проверить его размер, вы можете увидеть это 1.5МБ:

[email protected] 1 mark staff 1.5M 26 Oct 09:14 a.png 

Если я теперь сделать иначе идентичную, прозрачная версия:

convert -size 512x512 xc:gray +noise random -alpha transparent b.png 

Вы можете увидеть, что файл стал больше (в 1.7MB), потому что теперь хранить прозрачность и оригинальный случайные данные. Я не буду показывать изображение, потому что нет ничего, чтобы увидеть:

[email protected] 1 mark staff 1.7M 26 Oct 09:16 b.png 

теперь я могу сделать прозрачность слоя полностью непрозрачным и случайные пиксели снова становятся видимыми - таким образом, они все еще были там все вместе - даже когда изображение был прозрачным:

convert b.png -alpha opaque c.png 

enter image description here

Если, однако, я сделать пиксели прозрачными снова, а также установить их все к цвету фона изображения (так как их цвет не имеет значения), например:

convert -size 512x512 xc:gray +noise random -alpha transparent -alpha background d.png 

[email protected] 1 mark staff 1.8K 26 Oct 09:22 d.png 

И вот теперь 1.5MB-файл почти в 1000 раз меньше на 1,8K, потому что он сжимается намного лучше, поскольку все (невидимые/прозрачные) цвета - это один сплошной цвет фона.

В ответ на ваш вопрос о координатах. Мы можем сделать немного изображения, как это:

convert -size 1x1    \ 
     xc:red xc:cyan +append \ 
    \(xc:yellow xc:magenta +append \) -append a.png 

enter image description here

И сваливать это так:

convert a.png txt: 

# ImageMagick pixel enumeration: 2,2,65535,srgb 
0,0: (65535,0,0) #FF0000 red 
1,0: (0,65535,65535) #00FFFF cyan 
0,1: (65535,65535,0) #FFFF00 yellow 
1,1: (65535,0,65535) #FF00FF magenta 

И видим, что координаты пикселей в ImageMagick начинаются в верхнем левом углу.

+0

Ничего себе, спасибо за подробное объяснение! Получил это сейчас. – 3zzy

1

Система координат для пикселей на экране/изображения:

Любая система пикселя начинается от нижней точки крайней левой части экрана/изображения называется происхождения. Отображение пикселей начинается с 0-го индекса. (т. е. зеленая точка на снимке будет иметь (0,0) координаты). enter image description here


Пример:

Green pixel => (0,0) 
Transparent => (1,0) 
Blue => (1,1) 
Red => (0,1) 

Вы не выбрали большое количество пиксела выбора каждый пиксель сразу, а затем увеличиваете координаты, чтобы выбрать другой

т.е.

Если вы хотите получить цвет большого набора пикселей, вы получите один пиксель, проанализирующий его цвет, а затем выберите другой. Чтобы избежать предоставления координат снова и снова, вы можете сохранить координаты пикселя, который вы хотите выбрать или написать цикл, чтобы выбрать конкретную область.

пример:

Если вы хотите, чтобы цвет всех 4 пикселя, записать значение автоинкрементного рамочных координат от (0,0) до (1,1), получают цвет выбранного пикселя, обеспечивают координату следующий пиксель и получить цвет (повторить, пока вы хотите)

ИЛИ

объявить массив, который будет содержать координаты пикселей желаемому array => ([0]=> [0,0] [1]=> [0,1]....)

+1

Ваши результаты не согласуются с моими. Вы уверены, что отображение находится внизу слева? Я получаю это: '0,0 = красный; 0,1 = зеленый; 1,0 = синий; 1,1 = прозрачный ", который отображает верхнее левое отображение. – 3zzy

+0

Да Ваше заявление верное! Но большинство из них я изучил пиксельную и компьютерную графику в C, python, java и PHP. Когда мы использовали для анализа большую картину, например, в распознавании лиц, пиксель подсчитывается слева внизу с помощью DEFAULT. Теперь вы обязуетесь проверить, имеет ли он нижний левый или левый верхний угол? –

Смежные вопросы