Показать сообщение отдельно
Старый 27.06.2011, 00:00
fish_r вне форума Посмотреть профиль Отправить личное сообщение для fish_r Посетить домашнюю страницу fish_r Найти все сообщения от fish_r
  № 12  
Ответить с цитированием
fish_r
 
Аватар для fish_r

блогер
Регистрация: Jan 2011
Сообщений: 1,162
Записей в блоге: 4
Прочёл этот, уже старый, топик. Очень понравилось решение. Набросал по нему статик принимающий DObject, возвращающий копию отрисованную в Bitmap. Может кому пригодится .

Код:

Код AS3:
 
package su.fishr.display 
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.DisplayObject;
	import flash.geom.Matrix;
 
 
   /**
	 * Вспомогательный класс для изменения
	 * размеров растрового изображения
	 * с максимальным сглаживанием.
	 * 
	 * @version                1.0
	 * @playerversion          Flash 9
	 * @langversion            3.0
	 * @author                 fishr
	 * @created                26.06.2011 20:12
	 */
	public final  class SmoothResizeDObject
	{
 
	/**-------------------------------------------------------------------------------
	* 
	*								P U B L I C 	
	* 
	* --------------------------------------------------------------------------------
	*/
	//{
		/**
		 * Принимает DisplayObject исходного размера,
		 * возвращает копию объекта отрисованного в
		 * Bitmap требуемого размера.
		 * 
		 * 
		 * @param	dObj любой объект наследующий DisplayObject
		 * @param	prop одно из двух свойств объекта к которому требуется пропорционально изменить размер
		 * 			сообщенного объекта(height или width)
		 * @param	size требуемый "выходной" размер
		 * @return  объект преобразованный до нужного размера.
		 */
		public static function resizeDisplayObject(dObj:DisplayObject, prop:String, size:Number):Bitmap
		{
 
			var scale:Number;
			var bitmap:DisplayObject;
			bitmap = resizes( dObj, 1);
 
 
			if ( dObj[prop] > size )
			{
				scale = .5;
 
				while ( bitmap[prop] * scale > size )
				{
 
					bitmap = resizes( bitmap, scale );
				}
 
 
			}
			else
			{
				scale = 2;
 
				while ( bitmap[prop] * scale < size )
				{
 
					bitmap = resizes( bitmap, scale );
				}
 
 
			}
				bitmap[prop] = size;
				bitmap.scaleX !== 1? bitmap.scaleY = bitmap.scaleX: bitmap.scaleX = bitmap.scaleY;
 
			return bitmap as Bitmap;
		}
	//}
 
	/**-------------------------------------------------------------------------------
	* 
	*								P R I V A T E 	
	* 
	* --------------------------------------------------------------------------------
	*/	
	//{
 
 
		private static function resizes(dObj:DisplayObject, scale:Number):Bitmap
		{
 
			var bitmapData:BitmapData = new BitmapData(dObj.width * scale, dObj.height * scale);
			bitmapData.lock();
 
			var scaleMatrix:Matrix = new Matrix();
			scaleMatrix.scale( scale, scale );
 
			bitmapData.draw( dObj, 
							scaleMatrix, 
							dObj.transform.colorTransform, 
							"normal", 
							null,
							true);
 
 
			var bitmap = new Bitmap(bitmapData, "auto", true);
 
			bitmapData.unlock();
 
			/// Удаляем отработавший объект
			/// ...если это не тот который был принят
			/// в арг. вызова...
			if ( scale !== 1 )
			{
				with( Bitmap(dObj))
				{
						bitmapData.dispose();
						bitmapData = null;
				}
 
				dObj = null;
			}
 
 
			return bitmap;
 
 
 
		}
	//}
 
 
	}
 
}
Результат применения на растровом изображении размером 1300х2100.
Ресайзилось до ширины в 100 пикселей. Здесь немного увеличено.
Изображения
 


Последний раз редактировалось fish_r; 27.06.2011 в 01:36.