Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Функция getSize пакета flash.sampler. Непонятки с толкованием результатов выполнения. (http://www.flasher.ru/forum/showthread.php?t=200066)

timm 29.05.2013 18:04

Функция getSize пакета flash.sampler. Непонятки с толкованием результатов выполнения.
 
Добрый вечер!
Есть изображение (Pic01.jpg, 1440x900).
Загружаю его Loader`ом и хочу узнать сколько места занимает его bitmapData в памяти. Затем использую метод getVector у BD, чтобы взять информацию с нужного мне кусочка изображения и передаю Vector аргументом в метод setVector у нового объекта BD. Создаю Bitmap, назначаю ему новую BD и добавляю в список отображения. Здесь проблем нет.
После этого методом getSize также хочу узнать занимаемое место новым объектом BD.
Код AS3:

package {
 
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.display.Loader;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.geom.Rectangle;
        import flash.net.URLRequest;
        import flash.sampler.getSize;
 
        public class MemorySB extends Sprite {
 
                public function MemorySB() {
                        super();
                        stage.scaleMode = "noScale";
                        stage.align = "topLeft";
                        stage ? init() : addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
 
                        var loader:Loader = new Loader();
                        loader.contentLoaderInfo.addEventListener(Event.INIT, function(e:Event):void {
                                addChild(loader.content);
                                trace("Bitmap:", getSize(loader.content)); // 236
 
                                var imgBD:BitmapData = (loader.content as Bitmap).bitmapData;
                                trace("Original Image BD:", getSize(imgBD)); // Output: 48
 
                                var newBD:BitmapData = new BitmapData(100, 150, false);
                                newBD.setVector(new Rectangle(0, 0, 100, 150), (loader.content as Bitmap).bitmapData.getVector(new Rectangle(0, 0, 100, 150)));
                                var cropped:Bitmap = new Bitmap(newBD);
                                addChild(cropped);
                                cropped.x = 100;
                                cropped.y = 100;
 
                                trace("Cropped BD:", getSize(newBD)); // Output: 60048
                        });
                        loader.load(new URLRequest("Pic01.jpg"));
                }
 
        }
 
}

На выводе у исходного объекта BD значение — 48, у созданного — 60048.
Отсюда возникает несколько вопросов:
  1. В чём измеряется значение возвращаемое getSize?
  2. Почему значение для нового BD больше, чем для исходного, когда взятый кусок в разы меньше исходного изображения?
  3. Правильно ли использовать в данном случае методы getVector и setVector?

Wolsh 29.05.2013 20:38

Вы сами-то верите, что изображение 1440*900 может весить 48 байт?
3) copyPixels()

Rzer 29.05.2013 20:42

1) Полагаю что в байтах
2) У меня всё на своих местах, оригинал весит больше (для белого прямоугольника больших размеров):

Bitmap: 236
Original Image BD: 2595008
Cropped BD: 60048

3) Лучше использовать copyPixels. Методы setVector и getVector нужны, например, при чтении спецефичного форматa данных картинки, чтобы не вызывать setPixel каждый раз, а заполнить массив и присвоить его BitmapData'е. Или при каких-нибудь манипуляциях с цветом или положением точек.

КорДум 29.05.2013 20:45

Код AS3:

stage.scaleMode = "noScale";
stage.align = "topLeft";
stage ? init() : addEventListener(Event.ADDED_TO_STAGE, init);

Не могу удержаться. Смысл в последней строчке делать проверку существования stage, а раньше не делать?

timm 29.05.2013 22:06

Цитата:

Вы сами-то верите, что изображение 1440*900 может весить 48 байт?
Wolsh, да в общем-то не верю :) но вывод меня удивляет. Поэтому я и спросил в чем измеряется.
И как понимать? :) Это баг? Могу выложить то самое изображение.

Цитата:

Не могу удержаться. Смысл в последней строчке делать проверку существования stage, а раньше не делать?
КорДум, да, забавно вышло. Строчка на проверку стейджа у меня идет с шаблоном, а строки выше я добавил когда тестировал и не обратил внимание. Все нормально, опустил вниз в init :)

Wolsh, Rzer, на счет copyPixels понял, буду юзать.

iNils 30.05.2013 00:09

Размер картинки в памяти = w * h * 4 (даже если картинка без альфа-канала, все равно в памяти хранится 4 байта на пиксель)

timm 30.05.2013 00:15

Цитата:

Размер картинки в памяти = w * h * 4 (даже если картинка без альфа-канала, все равно в памяти хранится 4 байта на пиксель)
В общем, примерно 5 МБ.


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

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