Моя проблема такая общая, и есть плагины , зависящие от версии, которые не работают с моей версией. Я также нашел обходные пути , которые не являются правильными решениями.
Я хотел бы преобразовать белый цвет моего изображения в прозрачность, т.е. разложить серый на черный и прозрачный. Было бы правильно, если бы я мог использовать значение насыщенности пикселя из (де)композиции HSB, сделать насыщенность каждого пикселя равной 100% от исходного значения s(x,y) и добавить 100% - s(x, y) прозрачность до пикселя.
Как следует из упомянутого и многих других обходных путей, использование самого изображения в качестве альфа-канала не является решением. Например, если пиксель на 20% белый и на 80% серый, и вы применяете прозрачность 20%, то пиксель будет выглядеть как 80% - 0,8*0,2 = 56% черного вместо 80%.
Другой вопрос об обмене стеками о превращении белого в прозрачный похож на мою проблему, но, насколько я понимаю, он не распространяется на мою проблему. В случае, если я ошибаюсь, я был бы признателен, если бы кто-нибудь просветил меня, как применить это для моего сценария.
Я знаю, вы спрашивали, как это сделать в Photoshop, но это может быть один из немногих случаев (теперь, когда в Photoshop также есть заливка с учетом содержимого), где GIMP справляется с этой задачей лучше. Итак, мое предлагаемое решение:
Скачайте и установите GIMP. (Прокрутите вниз до установщика Windows.)
Откройте свое изображение в GIMP.
Используйте инструмент « Цвет в альфа -канал», чтобы преобразовать белый цвет в прозрачный ( маскируя и корректируя по мере необходимости, если вы хотите сохранить непрозрачный белый цвет в результате).
Сохраните полученное изображение и снова откройте его в Photoshop.
Примечание. GIMP может импортировать и экспортировать файлы Photoshop .psd, но некоторая информация может быть потеряна во время обратного преобразования. Может быть безопаснее редактировать файлы PSD только в Photoshop и вместо этого использовать формат PNG для передачи изображений между Photoshop и GIMP.
Вы не можете изменить серый цвет на черный и сделать белый прозрачным одним методом. Единственный способ сделать это без маскирования — изменить уровни на всем изображении. Поэтому, если у вас есть что-то цветное, например, на изображении, вам придется это замаскировать.
(Сначала продублируйте слой с изображением и скройте его для резервного копирования) На своем слое создайте маску слоя. выделите все изображение и скопируйте его ctrl+shift+c. Alt + щелкните значок маски слоя на панели слоев, чтобы активировать ее. ctrl+shift+v вставьте его туда. Снимите выделение и нажмите ctrl+i, чтобы инвертировать цвета. Все белые области теперь должны быть черными, то есть они замаскированы на 100%.
Теперь создайте корректирующий слой порога. это должно сделать слой ниже (ваш слой изображения) чисто черно-белым. При необходимости отрегулируйте баланс и добавьте маску слоя к порогу, если у вас есть цветные области, которые вы не хотите преобразовывать из серого в черный. Выберите все ctrl+shift+c, скопируйте и вставьте на исходный слой с изображением.
В результате должна получиться черно-белая версия вашего изображения с исходными черно-белыми (не пороговыми) значениями, управляющими слоем прозрачности. Ваши 20% серых теперь будут отображаться как 20% черных.
Просто из любопытства я придумал проверочный скрипт для PS, чтобы делать то, что вы предложили, но, к сожалению, он крайне медленный . Если вы хотите проверить это, создайте новый документ размером около 25 пикселей, назовите базовый слой «база», а затем добавьте два пустых слоя с именами «Альфа» и «HSB». Альфа-слой заполняется пикселями со значением серого (в RGB) на основе значения S, а слой HSB заполняется пикселями, значение S которых изменено на 100. Альфа-слой можно использовать в качестве маски слоя для слой HSB (выделить все, добавить маску слоя к слою HSB, переключиться на каналы и вставить скопированный альфа-слой в канал маски HSB).
Если вы скроете все палитры, кажется, что он работает немного быстрее, но реальное изображение будет медленным «иди, выпей кофе и, может быть, по магазинам». "Вздремнуть" медленно.
var currDoc = app.activeDocument;
var sampler = currDoc.colorSamplers.add([0,0]);
for (var x = 0; x < currDoc.width; ++x) {
for (var y = 0; y < currDoc.height; ++y) {
currDoc.activeLayer = currDoc.artLayers.getByName("base");
sampler.move([x,y]);
var result = selectPixel(x,y, currDoc);
result = setPixelColorHSB(sampler.color, currDoc);
result = setPixelColorALPHA(sampler.color, currDoc);
}
}
sampler = null;
currDoc.selection.deselect;
function setPixelColorHSB(pixelColor, currDoc) {
currDoc.activeLayer = currDoc.artLayers.getByName("HSB");
currDoc.activeLayer.visible = true;
var color = new SolidColor();
color.hsb.hue = pixelColor.hsb.hue;
color.hsb.saturation = 100;
color.hsb.brightness=pixelColor.hsb.brightness;
currDoc.selection.fill(color);
currDoc.activeLayer.visible = false;
return true;
}
function setPixelColorALPHA(pixelColor, currDoc) {
currDoc.activeLayer = currDoc.artLayers.getByName("ALPHA");
currDoc.activeLayer.visible = true;
var color = new SolidColor();
color.rgb.red = Math.floor((pixelColor.hsb.saturation/100) * 255);
color.rgb.green = color.rgb.red;
color.rgb.blue = color.rgb.red;
currDoc.selection.fill(color);
currDoc.activeLayer.visible = false;
return true;
}
function selectPixel (pixX, pixY, currDoc) {
currDoc.selection.deselect;
var selRegion = null;
selRegion = [
[pixX, pixY],
[pixX + 1, pixY],
[pixX + 1, pixY + 1],
[pixX, pixY + 1],
[pixX, pixY]
];
currDoc.selection.select(selRegion);
return true;
}
Я нашел способ, который соответствует моим требованиям. Делюсь с вами, чтобы вы могли покритиковать. Я ищу дальнейшие улучшения, поэтому не стесняйтесь добавлять свои заметки или ответы!
К сожалению, это решение не является общим из-за использования канала cmyk. Но с помощью этой процедуры вы можете получить это
из этого: (скачайте картинки и просмотрите прозрачность, если не видите отличий)
Джон
DanielTuzes
Стэн
Стэн