Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: ImageCopy и обрезка прозрачных пикселей

 PHP.SU

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


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

> Без описания
P-man
Отправлено: 06 Октября, 2011 - 13:21:18
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Окт. 2011  


Помог: 0 раз(а)




Дело было так:
Имеем две картинки 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. ?>

(Отредактировано автором: 06 Октября, 2011 - 13:39:58)

 
 Top
P-man
Отправлено: 06 Октября, 2011 - 13:22:38
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Окт. 2011  


Помог: 0 раз(а)




Картинка 1
Прикреплено изображение
1.gif
 
 Top
P-man
Отправлено: 06 Октября, 2011 - 13:22:54
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Окт. 2011  


Помог: 0 раз(а)




Картинка 2
Прикреплено изображение
2.gif
 
 Top
P-man
Отправлено: 06 Октября, 2011 - 13:23:29
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Окт. 2011  


Помог: 0 раз(а)




Итоговая картинка получается...
Прикреплено изображение
3.gif
 
 Top
P-man
Отправлено: 06 Октября, 2011 - 14:20:09
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Окт. 2011  


Помог: 0 раз(а)




На всякий случай, если кто не понял, вот какая картинка должна была получиться (в фотошопе слепил)
Прикреплено изображение
my.gif
 
 Top
illy
Отправлено: 15 Октября, 2011 - 16:04:44
Post Id



Участник


Покинул форум
Сообщений всего: 1117
Дата рег-ции: Июль 2011  
Откуда: от верблюда)


Помог: 28 раз(а)




А на php не получилось до сих пор?


-----
Всё гениальное - просто
И ещё проще, если ты - индиго
 
 Top
P-man
Отправлено: 17 Октября, 2011 - 11:53:31
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Окт. 2011  


Помог: 0 раз(а)




illy пишет:
А на php не получилось до сих пор?

Пока не получилось, но есть идеи.
Поближе познакомился с форматом GIF и узнал о нём много интересного. Например что в GIF есть такие параметры как "высота/ширина виртуаного экрана (пикс.)" и "левая/верхняя позиция изображения (пикс.)". Собсно "высота/ширина виртуаного экрана" это те размеры картинки какой мы её видим, а "левая/верхняя позиция изображения" это смещение изображения относительно левого верхнего угла картинки. PHP-шная ф-ция ImageCopy (или ImageCopyMerge) не учитывает это смещение изображения, поэтому в моём случае изображение на картинке с прозрачными областями по краям тупо прилипает к верхнему левому углу.
При помощи программы GIF OPENER посмотрел содержимое GIF-ки и узнал где прописываются значения левой и верхней позиции изображения (см. рис. - обведено красным), теперь осталось только отловить их PHP-улькой. У меня с этим проблемы (не знаю как это сделать). Может у кого есть идеи как это сделать?
Прикреплено изображение (Нажмите для увеличения)
gif.gif

(Отредактировано автором: 17 Октября, 2011 - 11:54:55)

 
 Top
P-man
Отправлено: 17 Октября, 2011 - 16:12:34
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Окт. 2011  


Помог: 0 раз(а)




Вот до чего докопался пока!
Долго гуглил и кое что нагуглил Радость
В итоге немного освоил работу с бинарными файлами. Написал функцию которая выдёргивает из гифа нужную мне инфу (левая/верхняя позиция изображения и ширина/высота изображения).
Вот что теперь получилось:
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. ?>


Прикреплённая картинка это получившийся результат. Как видите стало лучше, но не идеально - изображение стало "резаться" внизу. Сёдня мозг ужо не работает, так что если доковыривать и буду, то не раньше чем завтра.
Прикреплено изображение
3.gif

(Отредактировано автором: 17 Октября, 2011 - 16:14:21)

 
 Top
illy
Отправлено: 17 Октября, 2011 - 16:22:47
Post Id



Участник


Покинул форум
Сообщений всего: 1117
Дата рег-ции: Июль 2011  
Откуда: от верблюда)


Помог: 28 раз(а)




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


-----
Всё гениальное - просто
И ещё проще, если ты - индиго
 
 Top
P-man
Отправлено: 17 Октября, 2011 - 16:36:29
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Окт. 2011  


Помог: 0 раз(а)




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


Ну раз так, то не могли бы вы ознакомить нас с вашей версией Хм .
 
 Top
illy
Отправлено: 17 Октября, 2011 - 16:42:32
Post Id



Участник


Покинул форум
Сообщений всего: 1117
Дата рег-ции: Июль 2011  
Откуда: от верблюда)


Помог: 28 раз(а)




PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $q=90;
  3. $f='2.gif';
  4. $file='1.gif';
  5. $z=getimagesize($file);
  6. if($z[2]=='1'){ $p=ImageCreateFromgif($file); }
  7. if($z[2]=='2'){ $p=ImageCreateFromjpeg($file); }
  8. if($z[2]=='3'){ $p=ImageCreateFrompng($file); }
  9. $m=getimagesize($f);
  10. if($m[2]=='1'){ $wm=ImageCreateFromgif($f); }
  11. if($m[2]=='2'){ $wm=ImageCreateFromjpeg($f); }
  12. if($m[2]=='3'){ $wm=ImageCreateFrompng($f); }
  13. $d=imagecreatetruecolor($z[0],$z[1]);
  14. imagefill($d,0,0,0xffffff);
  15. imagecopyresampled($d,$p,0,0,0,0,$z[0],$z[1],$z[0],$z[1]);
  16. imagecopyresampled($d,$wm,0,0,0,0,$m[0],$m[1],$m[0],$m[1]);
  17. if($z[2]=='1'){ imagegif($d,'3.gif'); header ('Content-type: image/gif'); imagegif($d);}
  18. if($z[2]=='2'){ imagejpeg($d,'3.jpg', $q); header ('Content-type: image/jpeg'); imagejpeg($d);}
  19. if($z[2]=='3'){ imagepng($d,'3.png'); header ('Content-type: image/png'); imagepng($d);}
  20. ?>

немного исправил
Прикреплено изображение
3.gif

(Отредактировано автором: 17 Октября, 2011 - 16:53:01)



-----
Всё гениальное - просто
И ещё проще, если ты - индиго
 
 Top
P-man
Отправлено: 18 Октября, 2011 - 08:19:20
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Окт. 2011  


Помог: 0 раз(а)




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. ?>


Есть какие у кого замечания?
 
 Top
illy
Отправлено: 18 Октября, 2011 - 09:41:19
Post Id



Участник


Покинул форум
Сообщений всего: 1117
Дата рег-ции: Июль 2011  
Откуда: от верблюда)


Помог: 28 раз(а)




Я просто добавил прозрачность фотке Хорошо


-----
Всё гениальное - просто
И ещё проще, если ты - индиго
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Графика в PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB