#flash #actionscript-3 #flex4
#flash #actionscript-3 #flex4
Вопрос:
В Photoshop есть инструмент, который позволяет настраивать уровни изображения. Я хотел бы иметь возможность делать то же самое. Я видел примеры онлайн, которые показывают уровни, но они для каждого отдельного цветового канала (красный, зеленый, синий, альфа или CMYK), а не комбинированный вид, как в Photoshop Уровни ввода (см. Ниже).
Также, в качестве бонуса, есть ли способ найти наилучшие настройки уровня ввода теней и подсветки, в основном настройки, определяемые кнопкой автоматического уровня?
Обновить:
Я думаю, что я ближе, но я не уверен. Вот метод, который я собрал по кусочкам. Первое изображение — это мои результаты, а второе — результаты Photoshop, в обоих анализируется логотип Google:
Обновление 2:
Хорошо, я думаю, что я понял это. Код приведен ниже. В основном это работает постоянно, в основном.
Дополнительные кредиты:https://pixelero.wordpress.com/2008/06/19/flash-10-bitmapdatahistogram/#comment-448
Мои результаты:
Результаты фотосъемки:
Метод уровней:
/**
* Get a histogram of the grayscale levels
* */
private function drawGrayscaleHistogram(bitmapImage:BitmapImage, sprite:Sprite):BitmapData {
var grayScale:Array = [0.3086, 0.3086, 0.3086, 0, 0, 0.3086, 0.3086, 0.3086, 0, 0, 0.3086, 0.3086, 0.3086, 0, 0, 0, 0, 0, 1, 0];
var color:Array = [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0];
var filter:ColorMatrixFilter = new ColorMatrixFilter(grayScale);
var histogram:Vector.<Vector.<Number>>;
var graphWidth:int = sprite.width;
var graphHeight:int = sprite.height;
var g:Graphics = sprite.graphics;
var vector:Vector.<Number>;
var bitmapData:BitmapData;
var maxValue:int;
var value:int;
var i:int;
// clone the bitmap
bitmapData = bitmapImage.bitmapData.clone();
// convert it to gray scale
bitmapData.applyFilter(bitmapImage.bitmapData, bitmapImage.bitmapData.rect, new Point(), filter);
// get histogram
histogram = bitmapData.histogram();
// since it's grayscale the red green and blue are all the same
vector = histogram[0];
// get the max value for drawing the graph
for (var s:* in vector) {
if (vector[s]>maxValue) {
maxValue = vector[s];
}
}
//trace(maxValue);
//maxValue = 300;
// create white background
g.clear();
g.beginFill(0xFFFFFF, 1.0);
g.drawRect(0, 0, graphWidth, graphHeight);
// draw each line
for each (value in vector) {
g.lineStyle(1, 0);
g.moveTo(i, graphHeight);
g.lineTo(i , Math.max(0.0, graphHeight-value * graphHeight/maxValue));
}
// assign it to bitmap data
// so we can resize easily if we want
bitmapData = new BitmapData(graphWidth, graphHeight, true, 0x00000000);
bitmapData.draw(sprite);
return bitmapData;
}
Использование:
levelsBitmapImage.source = Нарисовать гистограмму в оттенках серого (выбранное изображение, sprite1);
<s: идентификатор растрового изображения = «Выбранное изображение» width=»100%» height =»100%» scaleMode= «почтовый ящик» />
<mx: идентификатор пользовательского компонента=»sprite1″/>
<s: идентификатор растрового изображения=»thresholdGraph» width=»100%» height =»45″ />
Комментарии:
1. Возможно, объединенные уровни относятся к яркости (значение в пикселях после преобразования в черно-белое), например
0.299 * R 0.587 * G 0.114 * B
.2. Я не уверен, что делать, что это. Графика не является моей сильной стороной.
3. Для каждого пикселя изображения получите значение яркости, используя формулу, затем увеличьте соответствующий счетчик (один из 256). Вы получите распределение уровней в этих 256 счетчиках. Нарисуйте эти значения в виде линий, и вы получите изображение уровней, подобное приведенному выше.
4. Я думаю, что понимаю. Я опубликую обратно то, что найду.
5. Я думаю, что я приближаюсь, но уровни не совпадают. Я обновил исходный пост обновлением.
Ответ №1:
Для каждого пикселя изображения получите значение яркости, используя формулу, затем увеличьте соответствующий счетчик (один из 256). Вы получите распределение уровней в этих 256 счетчиках. Нарисуйте эти значения в виде линий, и вы получите изображение уровней, подобное приведенному выше.
(скопировано из комментариев, чтобы дать правильный ответ)