Взятие цвета экшеном или скриптом?

  • Автор темы Автор темы chesen
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.
Ответ: Взятие цвета экшеном или скриптом?

Да ну, навряд ли, каким образом тут лассо можно приенить? Единственно что на ум извращенного приходит - создать селекшн из одного пиксела, записать в RAW файл а потом значение из него прочитать. '+||\\+'
 
Ответ: Взятие цвета экшеном или скриптом?

Шайтан!
Есть-таки решение, не менее извращенное:
http://www.ps-scripts.com/bb/viewtopic.php?t=2028
':=))'
Код:
function GetPixel( varX, varY ) {
    // make new 1 pixel selection
    activeDocument.selection.select( [[varX, varY], [varX + 1, varY], [varX + 1,
varY + 1], [varX, varY + 1]] );

    // init colour
    var pColour = new SolidColor();

    // get red histogram
    var pChannel = activeDocument.channels["Red"].histogram;

    // check 0 to 255
    for ( i = 0; i <= 255; i++ ) {
      if ( pChannel[i] ) {
        pColour.rgb.red = i;
        break;
      }
    }

    // get green histogram
    pChannel = activeDocument.channels["Green"].histogram;

    // check 0 to 255
    for ( i = 0; i <= 255; i++ ) {
      if ( pChannel[i] ) {
        pColour.rgb.green = i;
        break;
      }
    }

    // get blue histogram
    pChannel = activeDocument.channels["Blue"].histogram;

    // check 0 to 255
    for ( i = 0; i <= 255; i++ ) {
      if ( pChannel[i] ) {
        pColour.rgb.blue = i;
        break;
      }
    }

    return pColour;
}
 
Ответ: Взятие цвета экшеном или скриптом?

Опять пишет undefined в тулките, но скрипт пролетает без тормозов и признаков проделанной работы.
вот может пригодится?
Код:
// prompt("Define XY in pixels", 0, "Get Color Sample");
var x = 15;
var y = 15;
var cInput = new Array();
var cOutput = 0;

// collect the pixel values in all channels
selectBounds(docRef, [x, y, x+1, y+1]); 
for (var i = 0; i < docRef.channels.length; i++) { 
	docRef.channels[i].visible = true;
	// turn OFF all channels except current
	for (var j = 0; j < docRef.channels.length; j++) { 
		if (i != j) {docRef.channels[j].visible = false;}
		}
	cInput[i] = findPV(docRef.channels[i].histogram); 
}
docRef.selection.deselect();
docRef.activeChannels = activeChannels;
 
Ответ: Взятие цвета экшеном или скриптом?

Не, это вообще что-то явно из другой оперы.
Давайте копать мой предыдущий вариант. По идее, там не должно быть ничего, что б не нравилось CS2 объектной модели - должно работать. Берете этот код, добавляете к предыдущему примерно так:
Код:
function GetPixel( varX, varY ) {
    // make new 1 pixel selection
    activeDocument.selection.select( [[varX, varY], [varX + 1, varY], [varX + 1,
varY + 1], [varX, varY + 1]] );

    // init colour
    var pColour = new SolidColor();

    // get red histogram
    var pChannel = activeDocument.channels["Red"].histogram;

    // check 0 to 255
    for ( i = 0; i <= 255; i++ ) {
      if ( pChannel[i] ) {
        pColour.rgb.red = i;
        break;
      }
    }

    // get green histogram
    pChannel = activeDocument.channels["Green"].histogram;

    // check 0 to 255
    for ( i = 0; i <= 255; i++ ) {
      if ( pChannel[i] ) {
        pColour.rgb.green = i;
        break;
      }
    }

    // get blue histogram
    pChannel = activeDocument.channels["Blue"].histogram;

    // check 0 to 255
    for ( i = 0; i <= 255; i++ ) {
      if ( pChannel[i] ) {
        pColour.rgb.blue = i;
        break;
      }
    }

    return pColour;
}
var startRulerUnits = app.preferences.rulerUnits
var startDisplayDialogs = app.displayDialogs
var docRef = app.activeDocument;
var activeChannels = docRef.activeChannels;

app.preferences.rulerUnits = Units.PIXELS
app.displayDialogs = DialogModes.NO

var x = 200;
var y = 200; 
app.backgroundColor=GetPixel( x, y );
 
Ответ: Взятие цвета экшеном или скриптом?

Да, чуть не забыл! Для совместимости с русской версией лучше сделать так:
Код:
function GetPixel( varX, varY ) {
    // make new 1 pixel selection
    activeDocument.selection.select( [[varX, varY], [varX + 1, varY], [varX + 1,
varY + 1], [varX, varY + 1]] );

    // init colour
    var pColour = new SolidColor();

    // get red histogram
    var pChannel = activeDocument.channels[0].histogram;

    // check 0 to 255
    for ( i = 0; i <= 255; i++ ) {
      if ( pChannel[i] ) {
        pColour.rgb.red = i;
        break;
      }
    }

    // get green histogram
    pChannel = activeDocument.channels[1].histogram;

    // check 0 to 255
    for ( i = 0; i <= 255; i++ ) {
      if ( pChannel[i] ) {
        pColour.rgb.green = i;
        break;
      }
    }

    // get blue histogram
    pChannel = activeDocument.channels[2].histogram;

    // check 0 to 255
    for ( i = 0; i <= 255; i++ ) {
      if ( pChannel[i] ) {
        pColour.rgb.blue = i;
        break;
      }
    }

    return pColour;
}
var startRulerUnits = app.preferences.rulerUnits
var startDisplayDialogs = app.displayDialogs
var docRef = app.activeDocument;
var activeChannels = docRef.activeChannels;

app.preferences.rulerUnits = Units.PIXELS
app.displayDialogs = DialogModes.NO

var x = 200;
var y = 200; 
app.backgroundColor=GetPixel( x, y );
 
Ответ: Взятие цвета экшеном или скриптом?

Срослось! Низкий поклон, добрый человек!:y)
От русского языка шайтан миловал.
Но таки остается селекция в один пиксель. Хотелось бы охват больше и аверейдж к ним. Это реально?
 
Ответ: Взятие цвета экшеном или скриптом?

Ну это уже дело техники. У вас в конце скрипта стоит
Код:
docRef.selection.deselect();
Вставьте последней командой - селекции не будет оставаться.
Что касается размера в один пиксель - делайте не
Код:
activeDocument.selection.select( [[varX, varY], [varX + 1, varY], [varX + 1,
varY + 1], [varX, varY + 1]] );
а, например,
Код:
activeDocument.selection.select( [[varX, varY], [varX + 2, varY], [varX + 2,
varY + 2], [varX, varY + 2]] );
 
Ответ: Взятие цвета экшеном или скриптом?

Да, ясно. Все работает.'beer1'
 
Ответ: Взятие цвета экшеном или скриптом?

только это не average будет, а самые темные значения каналов в выделенном. average посчитать надо
 
Ответ: Взятие цвета экшеном или скриптом?

Мда, с Average лучше не связываться - придется попиксельно выделять и среднее считать - ужасный головняк. Чуть проще посчитать среднее между самым малым и самым большим - но это все равно напряжно и не совсем то, так что, лучше забейте. ;)
 
Ответ: Взятие цвета экшеном или скриптом?

гы, ну можно разблюрить все, взять цвет, потом undo.
но проще перейти на cs4 хотя бы )
 
Ответ: Взятие цвета экшеном или скриптом?

Достаточно на CS3, там уже в модели есть колорпикер.
 
Ответ: Взятие цвета экшеном или скриптом?

и не уговаривайте. я консервативен.:n)
 
Ответ: Взятие цвета экшеном или скриптом?

Взбодрим тему. Можно ли применить скриптом (ЦС2) пробу "пипетки белого" к выделенной части документа без вызова диалога кривых?
 
Ответ: Взятие цвета экшеном или скриптом?

Ничего не понял. Что значит "проба пипетки белого"?
 
Ответ: Взятие цвета экшеном или скриптом?

белую точку поставить
 
Ответ: Взятие цвета экшеном или скриптом?

в диалоговой палитре кривых и уровней есть три пипетки: черная, серая и белая. Тычками по изображению экспериментируешь с балансом.
 
Ответ: Взятие цвета экшеном или скриптом?

Теоретически, наверное, можно. У ArtLayer есть метод
adjustLevels
(inputRangeStart,
inputRangeEnd,
inputRangeGamma,
outputRangeStart,
outputRangeEnd)
По идее, если взять значение цвета из точки вышеописанным способом, а затем, неким алгоритмом преобразовать его в параметры для adjustLevels, то получим искомое.
 
Ответ: Взятие цвета экшеном или скриптом?

Один добрый человек написал мне скрипт пару лет назад (Его Имя Нельзя Писать На Этом Форуме:))
Там идет ТЫК по серой пипетке. Я староват для познания программирования, поэтому буду благодарен человечку, котороый мне его перепишет:
1. ТЫК белой пипеткой.
2. ТЫК по самой светлой части выделенной области.
3. Желательно, работа в рамках корректирующего слоя кривых.

Код:
// Save the current preferences
var startRulerUnits = app.preferences.rulerUnits
var startDisplayDialogs = app.displayDialogs
var docRef = app.activeDocument;
var activeChannels = docRef.activeChannels;

// Set Adobe Photoshop CS2 to use pixels and display no dialogs
app.preferences.rulerUnits = Units.PIXELS
app.displayDialogs = DialogModes.NO

// prompt("Define XY in pixels", 0, "Get Color Sample");
var x = 15;
var y = 15;
var cInput = new Array();
var cOutput = 0;

// collect the pixel values in all channels
selectBounds(docRef, [x, y, x+1, y+1]); 
for (var i = 0; i < docRef.channels.length; i++) { 
	docRef.channels[i].visible = true;
	// turn OFF all channels except current
	for (var j = 0; j < docRef.channels.length; j++) { 
		if (i != j) {docRef.channels[j].visible = false;}
		}
	cInput[i] = findPV(docRef.channels[i].histogram); 
}
docRef.selection.deselect();
docRef.activeChannels = activeChannels;

// get the average value (brightness)
for (var i = 0; i < cInput.length; i++) { 
	cOutput += (cInput[i] / cInput.length);
}

// adjust per channel
for (var i = 0; i < cInput.length; i++) { 
	docRef.channels[i].visible = true;
	// turn OFF all channels except current
	for (var j = 0; j < docRef.channels.length; j++) { 
		if (i != j) {docRef.channels[j].visible = false;}
		}
	docRef.activeChannels = Array(docRef.channels[i]);
	var cPoints = new Array(Array(0,0), Array(cInput[i], cOutput), Array(255,255));
	docRef.adjustLayer.adjustCurves(cPoints);
}
	
	
// Reset the application preferences
app.preferences.rulerUnits = startRulerUnits
app.displayDialogs = startDisplayDialogs
docRef.activeChannels = activeChannels;

function selectBounds(doc, b) { 
  doc.selection.select([[ b[0], b[1] ], 
					   [ b[2], b[1] ], 
					   [ b[2], b[3] ], 
					   [ b[0], b[3] ]]); 
} 

function findPV(h) { 
  for (var i = 0; i <= 255; i++ ) { 
	if (h[i]) { return i; } 
  } 
  return 0; 
}

Собственно , скриптом я хочу приводить лица на снимках к одному значению. Пипетка у меня заменена.
 
Статус
Закрыто для дальнейших ответов.