Отрисовка скриптом полупрозрачных знаков на исходном jpg-файле

ayrat9

Новичок
Отрисовка скриптом полупрозрачных знаков на исходном jpg-файле

Правильно ли я понимаю, что это НЕ удастся сделать?
 

virakochi

Устал
Почему же не удастся?
Смотря как это делать. Как вариант - http://www.imagemagick.org/
 

ayrat9

Новичок
imagemagik - не у всякого хостера стоит, насколько я знаю, а я хотел бы сделать это через GD
 

Tor

Новичок
нет, ты мне не учебник цитируй,
ты скажи, как ты хочешь что бы он выглядел?

может быть, тебе достаточно будет через пиксель рисовать свои "знаки"?
 

ayrat9

Новичок
есть дофигища картинок, которые заказчик хочет заляпать своим полупрозрачным логотипом. Можно конечно и макросом фотошопа все это организовать, но тогда при добавлении новых картинок на сайт через CMS нужно будет опять доставать этого пожирателя оперативки от Адоб Системс.

Учебника на ночь вчера начитался, но не понял: если есть 1 джпег файл и 1 шаблон логотипа, то при создании нового изображения (джпег) можно ли будет наложить этот логотип, чтобы он полупрозрачно лег на исходный рисунок.

Учебник говорит, что прозрачность достигается только у палитровых изображений.

Сразу оговорюсь, что я еще не брался за эту задачу на практике, поэтому все что я писал выше только мои предположения..
 

Tor

Новичок
jpeg не поддерживает прозрачность

gif - поддерживает

попробуй их наложить через gd и раскажи что получилось
 

ayrat9

Новичок
так это все и в учебнике написано, потому я так и написал в своем первом посте этого топика

-~{}~ 11.03.05 18:59:

меня смутил факт, что полноцветное изображение можно преобразовать в палитровое через imagetruecolortopalette()
 

Tor

Новичок
смотри:

в исходном jpg-e прозрачности нет
она есть только в gif-e, который нужно наложить

очевидно, что в результирующем файле так же не будет прозрачности, поэтому никаких противоречий нет

тебе нужно конвертнуть jpg в gif, наложить свой логотип и сохранить опять в jpg
 

ayrat9

Новичок
я боюсь качество сильно пострадает при таком подходе, хотя скорее всего он единственно верный.
 

valyala

Новичок
Отрисовка скриптом полупрозрачных знаков на исходном jpg-файле

Правильно ли я понимаю, что это НЕ удастся сделать?
ayrat9, ты ошибаешься. Это вполне осуществимая задача. Достаточно лишь немного подумать головой, а не другими местами :)
PHP:
/*
    Функция накладывает логотип $logo, имеющий
    альфа-канал $alpha, на картинку $img со смещением
    по координатам $base_x и $base_y

    $alpha - grayscale картинка с разрешением,
    аналогичным $logo, в которой черный цвет означает абсолютную
    непрозрачность, белый - абсолютная прозрачность, остальные
    цвета - различную степень полупрозрачности.
*/
function imagecopyalpha(&$img, $logo, $alpha, $base_x, $base_y)
{
    $width = imagesx($alpha);
    $height = imagesy($alpha);
    $base_width = imagesx($img);
    $base_height = imagesy($img);

    for ($x = 0; $x < $width; $x++, $base_x++) {
        if ($base_x < 0) continue;
        if ($base_x >= $base_width) break;
        for ($y = 0; $y < $height; $y++, $base_y++) {
            if ($base_y < 0) continue;
            if ($base_y >= $base_height) break;
            /*
                узнаем цвет пикселя картинки, на которую нужно наложить логотип
            */
            $img_color = imagecolorat($img, $base_x, $base_y);
            /*
                цвет пикселя для логотипа
            */
            $logo_color = imagecolorat($logo, $x, $y);
            /*
                узнаем значение "альфа-канала" для текущего пиксела логотипа
                (в нашем случае это синяя составляющая картинки $alpha)
                и нормализуем его, чтобы оно лежало в пределах от 0 до 1
                (0 - абсолютная непрозрачность, 1 - абсолютная прозрачность
            */
            $a = (imagecolorat($alpha, $x, $y) & 0xff) / 255.0;
            
            /*
                а вот тут начинается самое интересное - наложение логотипа
                на исходное изображение с учетом нашего "альфа-канала".
                Результирующий цвет пикселя вычисляется по очевидной формуле:
                    result_color = base_color * alpha + (1 - alpha) * logo_color
            */
            $r = (int) ((($img_color >> 16) & 0xff) * $a + (1.0 - $a) * (($logo_color >> 16) & 0xff));
            $g = (int) ((($img_color >> 8) & 0xff) * $a + (1.0 - $a) * (($logo_color >> 8) & 0xff));
            $b = (int) (($img_color & 0xff) * $a + (1.0 - $a) * ($logo_color & 0xff));

            $new_color = ($r << 16) | ($g << 8) | $b;
            imagesetpixel($img, $base_x, $base_y, $new_color);
        }
        $base_y -= $height;
    }
}
 

ayrat9

Новичок
valyala
Если ты не спер это из какой-нибудь книжки, то запиши себе в зачетку: "Я - гений!"

Ф-ция работает отлично. Но есть небольшой нюанс, в качестве логотипа и grayscale-картинки я использовал PNG-изображения (PNG-24), т.к. их Gif-ские аналоги накладывались не очень корректно.

Спасибо.
 
Сверху