2013-04-26 1 views
1

Мне нужно отображать загруженные пользователем логотипы на фоновом изображении. Фон логотипа должен быть прозрачным.Как смешивать изображения в режиме смешивания «темный цвет» в Photoshop?

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

В Photoshop, отображение этих логотипов на фоне прекрасно работает, когда вы выбираете «Темный цвет» в качестве режима наложения слоя.

Я пытаюсь добиться того же в PHP, поэтому я могу сделать эту работу без Photoshop.

Любые идеи?

ответ

0

Эта функция соответствует вашим потребностям.

http://www.php.net/manual/en/function.imagecolortransparent.php

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

+0

пиксель ниже чего? php будет отображать изображение вне контекста веб-страницы. – Octopus

0

Лично у меня были лучшие результаты с магики изображения, чем GD, но он не доступен на всех платформах http://php.net/manual/en/imagick.painttransparentimage.php

// Loads image 
    $im = new Imagick($source); 

    // Apply fuzz 
    $im->paintTransparentImage($im->getImagePixelColor(0, 0), 0, $fuzz); 

    // Writes image 
    $im->setImageFormat('png'); 
    $im->writeImage($target); 
    $im->destroy(); 

отмечают, что $im->getImagePixelColor(0, 0) получает цвет пикселя от верхней левой части изображения должны это должно работать с любой цвет BG, отрегулируйте $fuzz в зависимости от того, как пернатый логотип, возможно, держите его низким, если все прямые и сплошные цвета.

Также http://www.php.net/manual/en/imagick.trimimage.php очень полезен для удаления лишнего пространства на изображениях.

0

Я могу представить два возможных решения.

Можно было бы использовать смешение пикселей на уровне клиента с помощью javascript. Это может быть немного тяжелым процессором, поэтому, вероятно, это не самое лучшее решение, особенно для мобильных телефонов и других малогабаритных устройств. Существует библиотека под названием pixastic, которая позволяет некоторые режимы наложения в Photoshop.

Другим решением является обработка загруженного изображения с помощью gd2 в php и создание логотипа с прозрачностью путем замены цвета фона. В этом случае вам нужно будет знать, какой цвет фона используется. И тогда, что, если они также используют тот же самый цвет в логотипе? Вы также не хотели бы делать это прозрачным.

Посмотрите на следующие функции PHP (среди других в семье):

imagealphablending 
imagecolortransparent 

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

Если вам действительно нужно, чтобы пользователи создавали эти файлы, вы должны почти создать веб-инструмент, который позволяет им определять прозрачные области, вроде редактора значков Visual Studio.

0

Я не уверен, как к внутренностей PS, но в моей собственной реализации (не в PHP, заметьте) я подошел задачу следующим образом:

  1. Извлечение яркостной переднего плана и фона
  2. Сравнить фона и фона для создания пиксельной маски
  3. Назначить выход на основе производной маски.

Моя попытка родового псевдокоде:

Yfg = FG(:,:,1)*0.299 + FG(:,:,2)*0.587 + FG(:,:,3)*0.114; 
Ybg = BG(:,:,1)*0.299 + BG(:,:,2)*0.587 + BG(:,:,3)*0.114; 
mask = (Yfg > Ybg); 
R = BG(mask) + FG(~mask); 

Это, конечно, отличается от режима «Темнее», который просто делает реляционную смесь для каждого канала RGB.

Я не уверен, какая из этих проблем будет в PHP. Я больше знаком с смешиванием изображений, чем с PHP.