PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

Страниц (1): [1]

> Найдено сообщений: 9
P-man Отправлено: 18 Октября, 2011 - 08:19:20 • Тема: ImageCopy и обрезка прозрачных пикселей • Форум: Графика в PHP

Ответов: 12
Просмотров: 6278
illy пишет:
немного исправил


И это у вас работает Однако ? У меня ваш скрипт сделал те же ошибки что и скрипт приведённый мной изначально - картинка прилипла к левому верхнему краю. Вы его правда запускали? Если да, то попробуйте его "натравить" на приведённый мной исходные картинки и увидите что ничего не сработает (вы-то использовали другие исходные картинки как я вижу и похоже что без тех злополучных прозрачных областей).
Так что вопрос открыт. Буду пока докручивать свой вариант.

P.S. - кстати заливать картинку белым цветом тоже не правильно, т.к. картинки могут быть и с прозрачными областями.
(Добавление)
Готово!

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.   $f1 = "1.gif";
  3.   $f2 = "2.gif";
  4.   $img1 = @imagecreatefromgif($f1);
  5.   $img2 = @imagecreatefromgif($f2);
  6.   $pos = get_position($f2);
  7.   imagecopymerge($img1, $img2, $pos['left'], $pos['top'], 0, 0, $pos['width'], $pos['height'], 100);
  8.   ImageGif($img1, "3.gif");
  9.  
  10.   function get_position($image_file) {
  11.     if($fp = fopen($image_file, 'rb')) {
  12.       if($data = fread($fp, 20)) {
  13.         $aspect = unpack('@11/C1val', $data);
  14.         $data = fread($fp, ($aspect['val']*3 + 4 + 9));
  15.         $info = unpack('@'.($aspect['val']*3 + 4 + 1).'/C2left/C2top/C2Width/C2Height', $data);
  16.         return Array('left' => $info['left1'], 'top' => $info['top1'], 'width' => $info['Width1'], 'height' => $info['Height1']);
  17.       }
  18.       else
  19.         trigger_error("Can't read file `$image_file`", E_USER_WARNING);
  20.     }
  21.     else
  22.       trigger_error("Can't open file `$image_file`", E_USER_WARNING);
  23.   }
  24. ?>


Есть какие у кого замечания?
P-man Отправлено: 17 Октября, 2011 - 16:36:29 • Тема: ImageCopy и обрезка прозрачных пикселей • Форум: Графика в PHP

Ответов: 12
Просмотров: 6278
illy пишет:
Мудришь чтото Не понял
Ведь всё намного проще


Ну раз так, то не могли бы вы ознакомить нас с вашей версией Хм .
P-man Отправлено: 17 Октября, 2011 - 16:12:34 • Тема: ImageCopy и обрезка прозрачных пикселей • Форум: Графика в PHP

Ответов: 12
Просмотров: 6278
Вот до чего докопался пока!
Долго гуглил и кое что нагуглил Радость
В итоге немного освоил работу с бинарными файлами. Написал функцию которая выдёргивает из гифа нужную мне инфу (левая/верхняя позиция изображения и ширина/высота изображения).
Вот что теперь получилось:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.   $f1 = "1.gif";
  3.   $f2 = "2.gif";
  4.   $img1 = @imagecreatefromgif($f1);
  5.   $img2 = @imagecreatefromgif($f2);
  6.   $img_size = getimagesize($f1);
  7.   imagesetpixel($img2, 10, 10, imagecolorat($img2, 50, 50) );
  8.   $pos = get_position($f2);
  9.   imagecopymerge($img1, $img2, $pos['left'], $pos['top'], 0, 0, $img_size[0], $img_size[1], 100);
  10.   ImageGif($img1, "3.gif");
  11.  
  12.   function get_position($image_file) {
  13.     // открываем картинку в бинарном режиме
  14.     if($fp = fopen($image_file, 'rb')) {
  15.       // Считываем 20 байт с начала файла
  16.       if($data = fread($fp, 20)) {
  17.         // Получаем тип файла и кол-во цветов
  18.         $header = unpack('A6Version/@11/C1Aspect', $data);
  19.         $ver = $header['Version'];
  20.         $aspect = $header['Aspect'];
  21.         if($ver == 'GIF87a' || $ver == 'GIF89a') {
  22.           $data = fread($fp, (($aspect*3) + 4 /*блок расширения*/ + 9));
  23.           $format = '@'.(($aspect*3) + 4 /*блок расширения*/ + 1).'/C2Left/C2Top/C2Width/C2Height';
  24.           $info = unpack($format, $data);
  25.           return Array('left' => $info['Left1'], 'top' => $info['Top1'], 'width' => $info['Width1'], 'height' => $info['Height1']);
  26.         }
  27.         else
  28.           die("It's not GIF image file!");
  29.       }
  30.       else
  31.         die("Can't read file `$image_file`");
  32.     }
  33.     else
  34.       die("Can't open file `$image_file`");
  35.   }
  36. ?>


Прикреплённая картинка это получившийся результат. Как видите стало лучше, но не идеально - изображение стало "резаться" внизу. Сёдня мозг ужо не работает, так что если доковыривать и буду, то не раньше чем завтра.
P-man Отправлено: 17 Октября, 2011 - 11:53:31 • Тема: ImageCopy и обрезка прозрачных пикселей • Форум: Графика в PHP

Ответов: 12
Просмотров: 6278
illy пишет:
А на php не получилось до сих пор?

Пока не получилось, но есть идеи.
Поближе познакомился с форматом GIF и узнал о нём много интересного. Например что в GIF есть такие параметры как "высота/ширина виртуаного экрана (пикс.)" и "левая/верхняя позиция изображения (пикс.)". Собсно "высота/ширина виртуаного экрана" это те размеры картинки какой мы её видим, а "левая/верхняя позиция изображения" это смещение изображения относительно левого верхнего угла картинки. PHP-шная ф-ция ImageCopy (или ImageCopyMerge) не учитывает это смещение изображения, поэтому в моём случае изображение на картинке с прозрачными областями по краям тупо прилипает к верхнему левому углу.
При помощи программы GIF OPENER посмотрел содержимое GIF-ки и узнал где прописываются значения левой и верхней позиции изображения (см. рис. - обведено красным), теперь осталось только отловить их PHP-улькой. У меня с этим проблемы (не знаю как это сделать). Может у кого есть идеи как это сделать?
P-man Отправлено: 06 Октября, 2011 - 14:20:09 • Тема: ImageCopy и обрезка прозрачных пикселей • Форум: Графика в PHP

Ответов: 12
Просмотров: 6278
На всякий случай, если кто не понял, вот какая картинка должна была получиться (в фотошопе слепил)
P-man Отправлено: 06 Октября, 2011 - 13:23:29 • Тема: ImageCopy и обрезка прозрачных пикселей • Форум: Графика в PHP

Ответов: 12
Просмотров: 6278
Итоговая картинка получается...
P-man Отправлено: 06 Октября, 2011 - 13:22:54 • Тема: ImageCopy и обрезка прозрачных пикселей • Форум: Графика в PHP

Ответов: 12
Просмотров: 6278
Картинка 2
P-man Отправлено: 06 Октября, 2011 - 13:22:38 • Тема: ImageCopy и обрезка прозрачных пикселей • Форум: Графика в PHP

Ответов: 12
Просмотров: 6278
Картинка 1
P-man Отправлено: 06 Октября, 2011 - 13:21:18 • Тема: ImageCopy и обрезка прозрачных пикселей • Форум: Графика в PHP

Ответов: 12
Просмотров: 6278
Дело было так:
Имеем две картинки GIF, каждая размером 200х200 пикселей, первая не имеет прозрачных пикселей, вторая представляет собой прозрачный фон с небольшой непрозрачной областью вцентре.
Хотел "слить" вместе эти две картинки функцией ImageCopy (или ImageCopyMerge) так, чтобы вторая картинка легла поверх первой картинки, перекрыв её с учётом прозрачности пикселей (то-есть та непрозрачная область со второй картинки, по идее, должна была появиться в центре первой картинки). Однако в результате php, как будто, обрезал вторую картинку по прозрачным пикселам и как результат её непрозрачное содержимое вставилось ближе к левому верхнему углу первой картинки.
Никак не пойму как решить проблему.

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.   $f1 = "1.gif";
  3.   $f2 = "2.gif";
  4.   $img1 = @imagecreatefromgif($f1);
  5.   $img2 = @imagecreatefromgif($f2);
  6.   $img_size = getimagesize($f1);
  7.   imagecopymerge($img1, $img2, 0, 0, 0, 0, $img_size[0], $img_size[1], 100);
  8.   ImageGif($img1, "3.gif");
  9. ?>

Страниц (1): [1]
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB