PDA

Просмотр полной версии : Функция getSize пакета flash.sampler. Непонятки с толкованием результатов выполнения.


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

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.
Отсюда возникает несколько вопросов:

В чём измеряется значение возвращаемое getSize?
Почему значение для нового BD больше, чем для исходного, когда взятый кусок в разы меньше исходного изображения?
Правильно ли использовать в данном случае методы 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
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 МБ.