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

Регистрация: Jan 2009
Сообщений: 60
Отправить сообщение для serenkiy с помощью ICQ
Ну, раз используется 9я версия, переписал класс для 9й версии:
Код AS3:
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;
 
		}
	}
}