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

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

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

Регистрация: Apr 2008
Адрес: Kiev, Ukraine
Сообщений: 43
Отправить сообщение для sweet_fighter с помощью ICQ
По умолчанию Пропорциональное изменение размера BitmapData

Предисловие: Пользователь загружает картинку, любого размера, я ее принимаю, и предлагаю выбрать нужный квадрат для аватарки.
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), ведь пользователи загружают картинки с разными размерами.
Фух.. Помогите пжлста. Может кто что делал похожее. Я запутался.

Код AS3:
_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);

Старый 25.07.2011, 23:41
GBee вне форума Посмотреть профиль Отправить личное сообщение для GBee Найти все сообщения от GBee
  № 2  
Ответить с цитированием
GBee
 
Аватар для GBee

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
А вопрос-то какой?
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

Старый 26.07.2011, 00:04
sweet_fighter вне форума Посмотреть профиль Отправить личное сообщение для sweet_fighter Найти все сообщения от sweet_fighter
  № 3  
Ответить с цитированием
sweet_fighter
 
Аватар для sweet_fighter

Регистрация: Apr 2008
Адрес: Kiev, Ukraine
Сообщений: 43
Отправить сообщение для sweet_fighter с помощью ICQ
как матрицей с ее скейлами уменьшить предпросмотр(1) до такого же размера, что и загруженая картинка(2)?

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

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

это тогда получается, что нет смысла ресайзить битмап,
а сразу можно работать с маленькой битмапДатой
Код AS3:
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);

Старый 26.07.2011, 02:14
sweet_fighter вне форума Посмотреть профиль Отправить личное сообщение для sweet_fighter Найти все сообщения от sweet_fighter
  № 5  
Ответить с цитированием
sweet_fighter
 
Аватар для sweet_fighter

Регистрация: Apr 2008
Адрес: Kiev, Ukraine
Сообщений: 43
Отправить сообщение для sweet_fighter с помощью ICQ
silin, спасибо большое =)
помогло. Пошел дальше на барикады)
зы. Классный алгоритм скейла. У меня был немного топорный способ.
Код AS3:
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 ... //для ширины =)
Добавил квадратик, теперь все двигается и выбирается. Впредь ищущим, полный код с возможностью выбора картинки:
Код AS3:
 
_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, время: 09:17.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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