Показать сообщение отдельно
Старый 03.04.2009, 16:17
serenkiy вне форума Посмотреть профиль Отправить личное сообщение для serenkiy Найти все сообщения от serenkiy
  № 15  
Ответить с цитированием
serenkiy
 
Аватар для serenkiy

Регистрация: Jan 2009
Сообщений: 60
Отправить сообщение для serenkiy с помощью ICQ
Как я и предлагал, вот пример работы с гистограммой.

Класс "подборщика" цвета:
Код AS3:
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;
		}
	}
}
Тестируем:

Код AS3:
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();
		}	
	}
 
}
Если в функции pickedForBitmap второй параметр (contrast) будет false, то вернется "усредненный" цвет.

пример:


Последний раз редактировалось serenkiy; 03.04.2009 в 16:46.