Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 03.04.2009, 15:23
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 11  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
_dm, не понятно тебя: в чем нюанс, что значит "не сработает" ?, у меня почему-то работает
причем тут хардварное рисование тоже не совсем ясно, нативный draw по-любому будет быстрее скриптового счета, а реализуется он программно или на видеокарте - вопрос десятый

Старый 03.04.2009, 15:26
VVall вне форума Посмотреть профиль Отправить личное сообщение для VVall Найти все сообщения от VVall
  № 12  
Ответить с цитированием
VVall

Регистрация: Feb 2009
Сообщений: 1,195
Не сработает, потому что при уменьшении не усредняются значения всех точек.

Старый 03.04.2009, 15:59
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 13  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
>>Не сработает, потому что при уменьшении не усредняются значения всех точек.
ага, а только некоторых
возможно и не усредняются в прямом смысле, на глаз это выглядит именно так

Старый 03.04.2009, 16:11
_dm вне форума Посмотреть профиль Отправить личное сообщение для _dm Найти все сообщения от _dm
  № 14  
Ответить с цитированием
_dm

Регистрация: 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."... эх, а я думал оно и в окне ускоряет

Старый 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.
Старый 03.04.2009, 19:39
Mur4ik вне форума Посмотреть профиль Отправить личное сообщение для Mur4ik Найти все сообщения от Mur4ik
  № 16  
Ответить с цитированием
Mur4ik
ветеран форума

Регистрация: Sep 2008
Сообщений: 717
Записей в блоге: 4
Отправить сообщение для Mur4ik с помощью ICQ
Всем спасибо.
Метод silin'a тоже выдает не всегда приемлемые результаты (видимо это похоже просто на случайный выбор цвета одного пикселя), например на вечерних фотках, цвет всегда почти черный.
Метод serenkiy с хистограммой, наверное, самый правильный, но он под 10 плеер, "мне ща так низя"
Поэтому решил все таки искать средний цвет перебором чуток уменьшенного изображения.
Либо найти 4-8 средних цветов изображения и из них уже выбрать случайно один.

Вот еще осталось непонятно как сделать цвет чуть-чуть темнее?
Т.е не накладывать его с прозрачностью на темный фон или сверху него класть прозрачный темный фон, а именно сам цвет (т.е значение сделать темнее).
__________________
trace("Остановите Землю, я сойду!!!");


Последний раз редактировалось Mur4ik; 03.04.2009 в 19:49.
Старый 03.04.2009, 19:55
BlooDHounD вне форума Посмотреть профиль Отправить личное сообщение для BlooDHounD Посетить домашнюю страницу BlooDHounD Найти все сообщения от BlooDHounD
  № 17  
Ответить с цитированием
BlooDHounD
стервочка (я мужик)
 
Аватар для BlooDHounD

блогер
Регистрация: Mar 2004
Адрес: Борисов
Сообщений: 3,161
Записей в блоге: 22
станет потемнее
Код AS3:
color = ( ( color       ) & 0xFF - 0x33 ) |
        ( ( color >> 8  ) & 0xFF - 0x33 ) |
        ( ( color >> 16 ) & 0xFF - 0x33 );

Старый 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;
 
		}
	}
}

Старый 04.04.2009, 03:41
Mur4ik вне форума Посмотреть профиль Отправить личное сообщение для Mur4ik Найти все сообщения от Mur4ik
  № 19  
Ответить с цитированием
Mur4ik
ветеран форума

Регистрация: Sep 2008
Сообщений: 717
Записей в блоге: 4
Отправить сообщение для Mur4ik с помощью ICQ
serenkiy, спасибо за класс, пригодится

Вообщем методом проб и ошибок пришел к выводу, что наилучшим является метод с вычислением среднего значения цвета всех точек, а метод гистограмм чаще него выдает результат не подходящий к фотке.
Метод silin'a берет некий цвет прямо из центральной точки фотки (остальные не учитываются), наверное этот способ равносилен просто выборке цвета этой точки .

Всем спасибо.

Цитата:
Сообщение от BlooDHounD Посмотреть сообщение
станет потемнее
Код AS3:
color = ( ( color       ) & 0xFF - 0x33 ) |
        ( ( color >> 8  ) & 0xFF - 0x33 ) |
        ( ( color >> 16 ) & 0xFF - 0x33 );
чет не работает так

Но как же все таки сделать цвет потемнее?

Наверное BlooDHounD имел ввиду что то типа такого:

Код AS3:
frameColor = ( ( frameColor >> 16 ) & 0xFF - 0x33 ) << 16 |
		( ( frameColor >> 8  ) & 0xFF - 0x33 ) << 8 |
		( ( frameColor       ) & 0xFF - 0x33 );
так вроде работает, правильно ли это?
__________________
trace("Остановите Землю, я сойду!!!");


Последний раз редактировалось Mur4ik; 04.04.2009 в 04:03.
Старый 04.04.2009, 03:54
VVall вне форума Посмотреть профиль Отправить личное сообщение для VVall Найти все сообщения от VVall
  № 20  
Ответить с цитированием
VVall

Регистрация: Feb 2009
Сообщений: 1,195
Надо умножить значения RGB на число от 0 до 1 (1 полная яркость).

Создать новую тему Ответ Часовой пояс GMT +4, время: 01:19.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 01:19.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.