Фотошоп на моём компе прозрачность картинок практически любого размера меняет не задумываясь.
Попробовал реализовать это на РНР...
Получилось. Единственная гадость - работает это только для маааалюсеньких картинок (10х10рх легко обрабатывает). Как только дело доходит до картинок нормальных размеров - стопорится где-то на 250 итерации (то есть меняет прозрачность 250-ти точек, а дальше идёт всё сплошным цветом последней изменённой точки). Думал, может памяти не хватает, задал гиг - результат тот же Машинка у меня не слабая в общем-то, Атлон ХР 1.8+ и всё равно
Вот и думаю - а не допустил ли я где-нибудь ошибку?
Подскажите, кто знает?
Вот код:
- Код: выделить все
<?php
$out = "jpeg";
$name1 = "08_02.jpg";
$name2 = "8.jpg";
$opacity = 80;
error_reporting(E_ALL);
set_time_limit(0);
header("Content-type: image/".$out);
function pixel_transparent($left, $top, $im1, $im2, $opacity){
$index1 = ImageColorAt($im1, $left, $top);
$index2 = ImageColorAt($im2, $left, $top);
$rgb1 = ImageColorsForIndex($im1, $index1);
$rgb2 = ImageColorsForIndex($im2, $index2);
$result['red'] = ((($rgb1['red']-$rgb2['red'])*$opacity)/100)+$rgb2['red'];
$result['green'] = ((($rgb1['green']-$rgb2['green'])*$opacity)/100)+$rgb2['green'];
$result['blue'] = ((($rgb1['blue']-$rgb2['blue'])*$opacity)/100)+$rgb2['blue'];
return $result;
};
function open_image($name){
$image_info = GetImageSize($name);
switch($image_info[2]){
case "1":
$im = ImageCreateFromGif($name);
break;
case "2":
$im = ImageCreateFromJpeg($name);
break;
case "3":
$im = ImageCreateFromPng($name);
break;
};
$image_info['handler'] = $im;
$image_info['width'] = $image_info[0];
$image_info['height'] = $image_info[1];
return $image_info;
};
$im1 = open_image($name1);
$im2 = open_image($name2);
$im_r = ImageCreate($im2['width'], $im2['height']);
for($i=0; $i<$im2['height']; $i++){
if($i>$im1['height']) break;
for($a=0; $a<$im2['width']; $a++){
if($i>$im1['width']) break;
$color = pixel_transparent($a, $i, $im1['handler'], $im2['handler'], $opacity);
$c = ImageColorAllocate($im_r, $color['red'], $color['green'], $color['blue']);
ImageFilledRectangle($im_r, $a, $i, $a, $i, $c);
unset($c, $color);
};
};
switch($out){
case "png":
ImagePNG($im_r);
break;
case "gif":
ImageGif($im_r);
break;
case "jpeg":
ImageJpeg($im_r);
break;
};
ImageDestroy($im_r);
unset($im1, $im2, $color);
?>