PHP — изображение JPEG в массив значений RGB

Я хочу получить массив значений RGB из изображения. Например. (пример 2 X 2 пикс.)

[[[R, G, B], [R, G, B]], [[R, G, B], [R, G, B]]]

Код, который у меня есть сейчас:

<?php
// open an image
$image = imagecreatefromjpeg('image.jpg'); // imagecreatefromjpeg/png/
// get image dimension, define colour array
$width = imagesx($image);
$height = imagesy($image);
$colors = [];
for ($y = 0; $y < $height; $y++)
{
    for ($x = 0; $x < $width; $x++)
    {
        $rgb = imagecolorat($image, $x, $y);
        $r = ($rgb >> 16) & 0xFF;
        $g = ($rgb >> 8) & 0xFF;
        $b = $rgb & 0xFF;
    } 
}
print_r($colors);
?>

Вышеупомянутое не работает. Теперь мое изображение представляет собой просто jpeg размером 2 X 2 пикселя, который должен выводить:

    [[[0, 255, 0], [255, 0, 0]], [[0, 0, 255], [255, 255, 255]]]

Любая помощь очень ценится!


person Tom    schedule 17.10.2013    source источник
comment
Вы не добавляете $r $g $b в свой массив $colors ... Я бы начал с этого. $colors[] = array($r,$g,$b);   -  person cmorrissey    schedule 17.10.2013
comment
Вы только что забыли вставить $r, $g и $b в свой массив $colors? Я не вижу, где вы это делаете в приведенном выше коде.   -  person Will Hannah    schedule 17.10.2013
comment
Истинный. Спасибо, добавил. Просто получаю вывод Array() сейчас.   -  person Tom    schedule 18.10.2013


Ответы (3)


Хорошо, прибил это. Спасибо всем.

<?php
$image = imagecreatefromjpeg('image.jpg'); // imagecreatefromjpeg/png/

$width = imagesx($image);
$height = imagesy($image);
$colors = array();

for ($y = 0; $y < $height; $y++) {
$y_array = array() ;

for ($x = 0; $x < $width; $x++) {
    $rgb = imagecolorat($image, $x, $y);
    $r = ($rgb >> 16) & 0xFF;
    $g = ($rgb >> 8) & 0xFF;
    $b = $rgb & 0xFF;

    $x_array = array($r, $g, $b) ;
    $y_array[] = $x_array ; 
} 
$colors[] = $y_array ;
}

print_r($colors);
?>

Комментарии правильные, добавлены $r, $g, $b. Реструктурированный ответ @jari и теперь получаю хороший результат.

Ваше здоровье!

person Tom    schedule 18.10.2013
comment
Эй, ты знаешь, как преобразовать этот массив обратно в изображение? - person Jez; 19.12.2016

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

for ($y = 0; $y < $height; $y++)
{
    $height_arr = array() ;

    for ($x = 0; $x < $width; $x++)
    {
        $rgb = imagecolorat($image, $x, $y);
        $r = ($rgb >> 16) & 0xFF;
        $g = ($rgb >> 8) & 0xFF;
        $b = $rgb & 0xFF;

        $width_arr = array($r, $g, $b) ;
        $height_array[] = $width_arr ; 
    } 

    $colors[] = $height_arr ;
}
person vikingmaster    schedule 17.10.2013

Как насчет этого?

[...]
$colors = [];
for ($y = 0; $y < $height; $y++) {
    for ($x = 0; $x < $width; $x++) {
        $rgb = imagecolorat($image, $x, $y);
        $r = ($rgb >> 16) & 0xFF;
        $g = ($rgb >> 8) & 0xFF;
        $b = $rgb & 0xFF;
        $colors[$y][$x] = array($r,$g,$b);  // or, $colors[$x][$y] = array($r,$g,$b);
    } 
}
print_r($colors);
person Will Hannah    schedule 17.10.2013