|
|
|
| Подскажите как загнать изображение попиксельно в массив. | |
|
|
|
|
|
|
|
для: Саша88
(16.03.2011 в 17:39)
| | Нужно больше подробностей, что будет храниться в массиве (цвет в режиме RGB)? | |
|
|
|
|
|
|
|
для: cheops
(16.03.2011 в 17:58)
| | да, цвет в режиме RGB | |
|
|
|
|
|
|
|
для: Саша88
(16.03.2011 в 18:01)
| | Можно начать отталкиваться от следующего скрипта
<?php
// Снимаем ограничение по времени
@set_time_limit(0);
// Имя файла
$filename = "1.jpg";
// Открываем изображение
$im = imagecreatefromjpeg($filename);
// Получаем размер изображения
list($width, $height) = getimagesize($filename);
// Результирующий массив
$arr = array();
for($x = 0; $x < $width; $x++)
{
for($y = 0; $y < $height; $y++)
{
// Извлекаем цвет точки
$rgb = imagecolorat($im, $x, $y);
// Помещаем цвет в результирующий массив
$arr[$x][$y]['r'] = ($rgb >> 16) & 0xFF;
$arr[$x][$y]['g'] = ($rgb >> 8) & 0xFF;
$arr[$x][$y]['b'] = $rgb & 0xFF;
}
}
// Результат
print_r($arr);
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(16.03.2011 в 18:19)
| | Спасибо за пример, а что означает ($rgb >> 16) | |
|
|
|
|
|
|
|
для: Саша88
(16.03.2011 в 21:18)
| | Функция imagecolorat() возвращает результат в виде целого числа (8 байта), это позволяет хранить красный цвет в 2 байтах (от 0 до 255), зеленый в двух других байтах (от 0 до 255), а синий в третей паре байтов (от 0 до 255) и еще пару байтов в запасе остается (их для полупрозрачности обычно используют). Вот чтобы из такого упакованного числа получить эти три значения, нужно сдвгать биты к границе при помощи битового смещения >> и отрезать пару байтов при помощи битового пересечения & с маской 0xFF, которая отрезает все, кроме нужных двух байт.
PS Это проще представить, если перевести числа из десятичного и шестнадцетиричного формата в двоичный формат. | |
|
|
|
|
|
|
|
для: cheops
(16.03.2011 в 18:19)
| | Битовые сдвиги жестоко фэйлятся на картинках с индексированной палитрой. Надёжнее пользоваться функцией imagecolorsforindex() во всех случаях (даже для truecolor изображений). | |
|
|
|