![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Предисловие: Пользователь загружает картинку, любого размера, я ее принимаю, и предлагаю выбрать нужный квадрат для аватарки.
1. Пользователь загрузил. (bitmap) 2. Я ее уменьшил до пропорциональных размеров (bitmap.x, bitmap.y) 3. Предоставляю пользователю квадрат, который он может двигать по картинке, что бы выбрать лучшее + дублирую выбранную область.(как на картинке, где 2 это загруженная картинка, а 1 это предпросмотр вырезанной) [IMG]http://i.***********/i5/55/83/1778355/Zapysaty.png[/IMG] Проблема: При загрузке предпросмотра, я копирую(BitmapData) область под квадратом с оригинальным изображением, но копирование идет не с уменьшенного изображения с пункта(2), а оригинал(2345*1234px) который загрузил пользователь. Долго бился, потом вспомнил про Matrix. Но как матрицей с ее скейлами уменьшить предпросмотр(1) до такого же размера, что и загруженая картинка(2), ведь пользователи загружают картинки с разными размерами. Фух.. Помогите пжлста. Может кто что делал похожее. Я запутался. _bitmap = Bitmap(e.target.content); //оригинальная картинка _bitmap.width = resizeW(_bitmap.width, _bitmap.height); _bitmap.height = resizeH(_bitmap.width, _bitmap.height);//Изменили пропорционально размеры var bmd:BitmapData = new BitmapData(_bitmap.width, _bitmap.height, true, 0x00000000); //Дублируем для превью var bmd2:BitmapData = new BitmapData(69, 69); bmd.draw(_bitmap, mat, null, null, null, true); //mat - матрица со скейлами (scaleX, scaleY) var rect:Rectangle = new Rectangle(0, 0, 69, 69); //69*69 - размер превью-квадрата var pt:Point = new Point(0, 0); bmd2.copyPixels(bmd, rect, pt); var bmp:Bitmap = new Bitmap(bmd2); addChild(bmp); |
|
|||||
|
как матрицей с ее скейлами уменьшить предпросмотр(1) до такого же размера, что и загруженая картинка(2)?
|
|
|||||
|
>>2. Я ее уменьшил до пропорциональных размеров
это тогда получается, что нет смысла ресайзить битмап, а сразу можно работать с маленькой битмапДатой var s:Number = Math.max(69 / _bitmap.width , 69 / _bitmap.height); var mat:Matrix = new Matrix(); mat.scale(s, s); var w:Number = s * _bitmap.width; var h:Number = s * _bitmap.height; // уменьшенная картинка var bmd1:BitmapData = new BitmapData(w, h, true, 0x00000000); //срисовываем с масштабированием bmd1.draw(_bitmap, mat, null, null, null, true); var bmp1:Bitmap = new Bitmap(bmd1); // обрезанная картинка var bmd2:BitmapData = new BitmapData(69, 69); var rect:Rectangle = new Rectangle(0, 0, 69, 69); //69*69 - размер превью-квадрата var pt:Point = new Point(0, 0); bmd2.copyPixels(bmd1, rect, pt); var bmp2:Bitmap = new Bitmap(bmd2); bmp2.x = bmp1.width+10; addChild(bmp1); addChild(bmp2); |
|
|||||
|
silin, спасибо большое =)
помогло. Пошел дальше на барикады) зы. Классный алгоритм скейла. У меня был немного топорный способ. var newHeight:Number = 69; var newWidth:Number = 69; if ( mc.height > mc.width ) { var ratio:Number = mc.width / mc.height; var newWidth:Number = newHeight * ratio; mc.width = newWidth; mc.height = newHeight; } else if ... //для ширины =) _bitmap = Bitmap(e.target.content); //исходное изображение var square:Sprite = new Sprite(); var s:Number = Math.max(70 / _bitmap.width , 70 / _bitmap.height); var mat:Matrix = new Matrix(); mat.scale(s, s); var w:Number = s * _bitmap.width; var h:Number = s * _bitmap.height; // уменьшенная картинка var bmd1:BitmapData = new BitmapData(w, h, true, 0x00000000); //срисовываем с масштабированием bmd1.draw(_bitmap, mat, null, null, null, true); var bmp1:Bitmap = new Bitmap(bmd1); // обрезанная картинка bmd2 = new BitmapData(70, 70); var rect:Rectangle = new Rectangle(0, 0, 70, 70); //70*70 - размер превью-квадрата var pt:Point = new Point(0, 0); bmd2.copyPixels(bmd1, rect, pt); var bmp2:Bitmap = new Bitmap(bmd2); bmp2.smoothing = true; bmp2.x = -100; //Добавляем квадратик square.buttonMode = true; square.graphics.lineStyle(1,0x0099FF); square.graphics.beginFill(0xFFFFFF, .3); square.graphics.drawRect(0,0,69,69); square.graphics.endFill(); var bounds:Rectangle = new Rectangle(_bitmap.x, _bitmap.y, w-70, h-70);//задаем границы для нашего квадрата square.addEventListener(MouseEvent.MOUSE_DOWN, startScroll); stage.addEventListener(MouseEvent.MOUSE_UP, stopScroll); addChild(bmp1); addChild(square); addChild(bmp2); function startScroll(e:Event):void { stage.addEventListener(Event.ENTER_FRAME, reCalc); square.startDrag(false,bounds); } function stopScroll(e:Event):void { square.stopDrag(); stage.removeEventListener(Event.ENTER_FRAME, reCalc); } function reCalc(e:Event):void { //Делаем пересчет в зависимости от положения квадрата rect = new Rectangle(0, 0, 70+square.x, 70+square.y); pt = new Point(0-square.x, 0-square.y); bmd2.copyPixels(bmd1, rect, pt); } Последний раз редактировалось sweet_fighter; 26.07.2011 в 02:21. |
![]() |
![]() |
Часовой пояс GMT +4, время: 05:43. |
|
|
« Предыдущая тема | Следующая тема » |
|
|