|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
_dm, не понятно тебя: в чем нюанс, что значит "не сработает" ?, у меня почему-то работает
причем тут хардварное рисование тоже не совсем ясно, нативный draw по-любому будет быстрее скриптового счета, а реализуется он программно или на видеокарте - вопрос десятый |
|
|||||
Регистрация: Feb 2009
Сообщений: 1,195
|
Не сработает, потому что при уменьшении не усредняются значения всех точек.
|
|
|||||
Регистрация: Feb 2009
Сообщений: 23
|
>>_dm, не понятно тебя: в чем нюанс, что значит "не сработает" ?, у меня почему-то работает
Если честно, я не пробовал рисовать сразу в один пиксель, просто если уменьшать в 2 раза, так будут усреднятся именно соседние пиксели, а если сразу в надцать раз уменьшить - некоторые точки не будут учтены... но если точность не важна, то можно сразу рисовать в 1 пиксель =) З.Ы. погуглил о хардварном ускорении - в адобовском блоге написано "Starting in version 9.0.115.0, the Flash Player was able to display _fullscreen_ content with GPU assistance."... эх, а я думал оно и в окне ускоряет |
|
|||||
Как я и предлагал, вот пример работы с гистограммой.
Класс "подборщика" цвета: package { import flash.display.BitmapData; public final class ColorPickup { public function ColorPickup(){} // Функция нахождения контрастного цвета исходя из цвета public static function pickedForColor(color:uint):uint { return (0xFFFFFF - color); } // Функция нахождения цвета исходя из изображения public static function pickedForBitmap(bitmapData:BitmapData,contrast:Boolean):uint { var histogram:Vector.<Vector.<Number>> = bitmapData.histogram(), rmax:uint=0, gmax:uint=0, bmax:uint=0, r:uint=0, g:uint=0, b:uint=0, color:uint; for (var i:uint = 0; i < 256; i++) { if (rmax < histogram[0][i]) { rmax = histogram[0][i]; r = i; } if (gmax < histogram[1][i]) { gmax = histogram[1][i]; g = i; } if (bmax < histogram[2][i]) { bmax = histogram[2][i]; b = i; } } color = ((r << 16) | (g << 8) | b); if(contrast) color=pickedForColor(color); return color; } } } package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Sprite; public class project extends Sprite { [Embed(source = 'testimage.jpg')] private var TestImage:Class; private var bitmap:Bitmap = new TestImage(); public function project() { addChild(bitmap); bitmap.x = (stage.stageWidth - bitmap.width)/2; bitmap.y = (stage.stageHeight - bitmap.height) / 2; var color:uint = ColorPickup.pickedForBitmap(bitmap.bitmapData, false); graphics.beginFill(color); graphics.drawRect(bitmap.x - 10, bitmap.y - 10, bitmap.width + 20, bitmap.height + 20); graphics.endFill(); } } } пример: Последний раз редактировалось serenkiy; 03.04.2009 в 16:46. |
|
|||||
ветеран форума
|
Всем спасибо.
Метод silin'a тоже выдает не всегда приемлемые результаты (видимо это похоже просто на случайный выбор цвета одного пикселя), например на вечерних фотках, цвет всегда почти черный. Метод serenkiy с хистограммой, наверное, самый правильный, но он под 10 плеер, "мне ща так низя" Поэтому решил все таки искать средний цвет перебором чуток уменьшенного изображения. Либо найти 4-8 средних цветов изображения и из них уже выбрать случайно один. Вот еще осталось непонятно как сделать цвет чуть-чуть темнее? Т.е не накладывать его с прозрачностью на темный фон или сверху него класть прозрачный темный фон, а именно сам цвет (т.е значение сделать темнее).
__________________
trace("Остановите Землю, я сойду!!!"); Последний раз редактировалось Mur4ik; 03.04.2009 в 19:49. |
|
|||||
стервочка (я мужик)
|
станет потемнее
|
|
|||||
Ну, раз используется 9я версия, переписал класс для 9й версии:
package { import flash.display.BitmapData; import flash.utils.ByteArray; public final class ColorPickup { public function ColorPickup(){} // Функция нахождения контрастного цвета исходя из цвета public static function pickedForColor(color:uint):uint { return (0xFFFFFF - color); } // Функция нахождения цвета исходя из изображения public static function pickedForBitmap(bitmapData:BitmapData,contrast:Boolean):uint { var histogram:Array = getHistogram(bitmapData), rmax:uint = 0, gmax:uint = 0, bmax:uint = 0, r:uint = 0, g:uint = 0, b:uint = 0, color:uint; for (var i:uint = 0; i < 256; i++) { if (rmax < histogram[0][i]) { rmax = histogram[0][i]; r = i; } if (gmax < histogram[1][i]) { gmax = histogram[1][i]; g = i; } if (bmax < histogram[2][i]) { bmax = histogram[2][i]; b = i; } } color = ((r << 16) | (g << 8) | b); if (contrast) color = pickedForColor(color); return color; } // Функция нахождения гистограммы изображения public static function getHistogram(bitmapData:BitmapData):Array { var bytes:ByteArray = bitmapData.getPixels(bitmapData.rect), array:Array = new Array(3), currentByte:int, r:int, g:int, b:int; array[0] = new Array(256); array[1] = new Array(256); array[2] = new Array(256); for (var i:uint = 0; i < 256; i++) { array[0][i] = array[1][i] = array[2][i] = 0; } bytes.position = 0; while (bytes.bytesAvailable != 0) { currentByte = bytes.readUnsignedInt(); r = (currentByte & 0x00FF0000) >> 16; g = (currentByte & 0x0000FF00) >> 8; b = (currentByte & 0x000000FF); array[0][r] += 1; array[1][g] += 1; array[2][b] += 1; } return array; } } } |
|
|||||
ветеран форума
|
serenkiy, спасибо за класс, пригодится
Вообщем методом проб и ошибок пришел к выводу, что наилучшим является метод с вычислением среднего значения цвета всех точек, а метод гистограмм чаще него выдает результат не подходящий к фотке. Метод silin'a берет некий цвет прямо из центральной точки фотки (остальные не учитываются), наверное этот способ равносилен просто выборке цвета этой точки . Всем спасибо. Цитата:
Но как же все таки сделать цвет потемнее? Наверное BlooDHounD имел ввиду что то типа такого: так вроде работает, правильно ли это?
__________________
trace("Остановите Землю, я сойду!!!"); Последний раз редактировалось Mur4ik; 04.04.2009 в 04:03. |
|
|||||
Регистрация: Feb 2009
Сообщений: 1,195
|
Надо умножить значения RGB на число от 0 до 1 (1 полная яркость).
|
Часовой пояс GMT +4, время: 01:19. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|