Как изменить размер динамически загружаемого изображения во flash (as3) - PullRequest
4 голосов
/ 25 сентября 2010

Я изо всех сил пытаюсь найти правильный код as3 для изменения размера изображения, как только оно динамически вызывается на сцену и помещается в MC. Я загружаю, используя:

var myLoader :Loader = new Loader(); 
mc.addChild(myLoader);
var url :URLRequest = new URLRequest("myimage.jpg"); 
myLoader .load(url );

Сцена в конечном итоге откроется в полноэкранном режиме (работает нормально), поэтому мне нужно сохранить исходный размер изображения, который намного больше, чем у сцены.

Что мне нужно сделать, так это сжать его при загрузке до той же высоты, что и сцена, сохраняя при этом ширину пропорционально (ой и центрируйте ее) Я перепробовал все виды кодов, но не могу найти что-нибудь для работы, так как все, что мне удалось сделать, это изменить размер MC, содержащего изображение, но НЕ само изображение. Любое руководство относительно правильного кода будет с благодарностью.

Полагаю, это так же просто, как что-то вроде

 "myimage".x=600;

но если это так, как правильно написать имя изображения, как я уже писал, это кажется ошибочным. Большое спасибо

Ed

Ответы [ 9 ]

9 голосов
/ 29 сентября 2010

пытаюсь ответить на ваши вопросы

 import flash.display.MovieClip;
 import flash.display.Sprite;
 import flash.display.DisplayObject;
 import flash.display.Loader;
 import flash.display.LoaderInfo;
 import flash.events.Event;

   var myLoader:Loader = new Loader(); 
   var image:Bitmap;
   var url :URLRequest = new URLRequest("im1.jpg");
   myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoaded);
   myLoader.load(url);

   function onImageLoaded(e:Event):void {
      image = new Bitmap(e.target.content.bitmapData);
      var mw:Number = stage.stageWidth;
      var mh:Number = stage.stageHeight;   
      /* if you set width and height image same with the stage use this */
      image.width = mw;
      image.height = mh;
      mc.addChild(image);
   }
3 голосов
/ 20 января 2012

Попробуйте этот код:

img1_mc.scaleX = (stage.stageWidth/img1_mc.width)
img1_mc.scaleY = (stage.stageHeight/img1_mc.height)
3 голосов
/ 25 сентября 2010

Вам нужно дождаться загрузки изображения, а затем вы можете изменить размер вашего загрузчика, например:

package {
 import flash.display.MovieClip;
 import flash.display.Sprite;

 import flash.display.DisplayObject;
 import flash.display.Loader;
 import flash.display.LoaderInfo;
 import flash.events.Event;

 public class Test extends Sprite {

  public function Test(){
    super();

    if (stage) {
      init();
    } else {
     addEventListener(Event.ADDED_TO_STAGE, init, false, 0, true);
    }
  }

  public var mc:MovieClip;

  private function init(e:Event=null):void{
   if (e!=null) {
     e.target.removeEventListener(e.type, arguments.callee);
   }

   mc = new MovieClip();
   addChild(mc);

   var myLoader:Loader = new Loader(); 
   mc.addChild(myLoader);

   // listen when the image is fully loaded
   myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoaded);


   var url :URLRequest = new URLRequest("myimage.jpg"); 
   myLoader.load(url);
  }

  private function onImageLoaded(e:Event):void {
   var li:LoaderInfo = e.target as LoaderInfo;
   li.removeEventListener(e.type, arguments.callee);

   // resize the loader while preserving ratio
   var ldr:Loader=li.loader;
   var mw:Number = stage.stageWidth / ldr.width;
   var mh:Number = stage.stageHeight / ldr.height;

   var ratio:Number = (mw < mh) ? mw : mh;

   ldr.width *= ratio;  // you can also use ldr.scaleX=ratio;
   ldr.height *= ratio; // you can also use ldr.scaleY=ratio;

   // center mc on stage
   mc.x=0.5*(stage.stageWidth-mc.width);
   mc.y=0.5*(stage.stageHeight-mc.height);
  }
 }
}
2 голосов
/ 25 сентября 2010

Вы также можете попробовать классы Loader на
http://www.greensock.com/loadermax/

Они отлично справляются с задачей упрощения и оптимизации процесса загрузки, с несколькими приятными преимуществами.

Проверьте класс ImageLoader http://www.greensock.com/as/docs/tween/com/greensock/loading/ImageLoader.html

в частности, как вы можете установить несколько дополнительных свойств vars перед загрузкой.

Вот небольшой отрывок из примера, приведенного в документации ...

//create an ImageLoader:
 var loader:ImageLoader = new ImageLoader("img/photo1.jpg", 
 //here's the sweet part :)
 {name:"photo1", 
 container:this, 
 x:180, 
 y:100, 
 width:200, //here you could set the stageWidth for instance
 height:150, //and the stageHeight here
 scaleMode:"proportionalInside", //this one will definitely help you , check the docs!
 centerRegistration:true, 
 onComplete:onImageLoad});

1 голос
/ 27 сентября 2010

У меня было множество ошибок с приведенным выше кодом, по-видимому, сказал, что не может использовать вложенный публичный класс или что-то еще, поэтому я удалил пакет и публичные функции, и я получил его работать с этим кодомнекоторое сглаживание там.Мне нужно изучить, потому что я не уверен, в чем разница между общими и частными функциями?

Еще одна проблема, ребята, я могу успешно динамически загружать изображения, если они находятся в той же папке, что и SWF-файл, который их загружает.но если я попытаюсь удержать изображения в отдельном файле и вызвать их как-то как

var url: URLRequest ... и т. д. ("stills / image1.jpg");они просто не загружаются.Видите, что-то не так ??

Снова ОГРОМНОЕ СПАСИБО за помощь

Ed

0 голосов
/ 18 декабря 2014

У меня тоже были такие проблемы, можете попробовать это ..... у меня сработало

var my_loader:Loader = new Loader();
        my_loader.load(new URLRequest("underwater.jpg"));
        var holder:MovieClip=new MovieClip();
        my_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function(){
my_loader.content.width = stage.stageWidth;
my_loader.content.height = stage.stageHeight;
0 голосов
/ 21 июля 2014

Я некоторое время боролся с этим, но если вы используете AS3, просто перетащите объект uiloader на сцену и установите для его источника и, самое главное, свойство scaleContent значение true ....

Это прекрасно работает для меня и требует меньше кода:

uiloader.autoLoad = true;
uiloader.scaleContent = true;
uiloader.source = "photos/yourphoto.jpg";
0 голосов
/ 30 сентября 2010

Я просто искал, как изменить размер изображения, и нашел эту удобную библиотеку http://jacwright.com/blog/221/high-quality-high-performance-thumbnails-in-flash/

, когда вспышка уменьшает изображение, оно имеет лучшее качество, когда вы уменьшаете его в два раза, а затем продолжаете изменять его в два разавы получаете желаемый размер

библиотека делает все это за вас

на сайте есть несколько примеров и ссылки на его кодовую страницу Google

могут быть не совсем такими, как вы хотите, но работает довольно хорошо

0 голосов
/ 25 сентября 2010

вам нужно добавить слушателя для прослушивания события INIT на то, что вы загружаете.

И вам не нужно изменять размер самого файла image.jpg (и способ, которым вы пытаетесь решить его, не будет работать). Вместо этого вы можете изменить размер загрузчика.

Если вы посмотрите Документы AS3 для LoaderInfo, в конце вы найдете пример, который показывает, как добавить слушателей. (Обратите внимание, что слушатель добавляется к объекту contentLoaderInfo, а не к самому Loader).

Затем вы можете использовать обработчик событий для изменения размера. Документы AS3 показывают пример в initHandler, который просто отслеживает некоторые вещи. Если вы сделали loader.x = 600, вы получите то, что вам нужно.

...