В фотошопе есть инструмент, позволяющий регулировать уровни изображения. Я хотел бы иметь возможность сделать то же самое. В Интернете я видел примеры, которые показывают уровни, но они есть для каждого отдельного цветового канала (красный, зеленый, синий или альфа или 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 = drawGrayscaleHistogram (selectedPicture, sprite1);