Изменение размера изображения из декодированного массива ByteArray

Я пытаюсь отобразить массив байтов как изображение с измененным размером. Изображение отображается правильно, но размер отключен. Позволь мне объяснить.

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

// Instantiate decoder
var decoder:Base64Decoder = new Base64Decoder();
// Decode image data
decoded.decode(picture.data);
// Export data as a byteArray
var byteArray:ByteArray = decoder.toByteArray();
// Display image
var img:Image = new Image();
img.load(byteArray);

Это работает. Изображение отображается правильно. Однако, если я жестко закодирую высоту изображения (img), изображение с измененным размером отображается правильно, но в поле с размерами исходного изображения.

Например, если исходное изображение имеет высоту 300 пикселей и ширину 200 пикселей, а для свойства img.height установлено значение 75; измененное изображение с высотой 75 отображается правильно. Но изображение с измененным размером отображается в верхнем левом углу контейнера img, для которого по-прежнему задана высота 300 пикселей и ширина 200 пикселей. Почему это так? А что исправить?

Лучший способ проиллюстрировать проблему - поместить изображение внутри VBox и показать границы VBox. Из приведенного выше блока кода, если я изменю высоту изображения и установлю для изображения сохранение соотношения сторон (которое по умолчанию имеет значение true, но я добавляю его сюда для полноты картины). проблема становится ясной.

// Display image
var img:Image = new Image();
img.height = 75; // Hardcode image height (thumbnail)
img.maintainAspectRatio = true;
img.load(byteArray);
// Encapsulate the image inside a VBox to illustrate the problem
var vb:VBox = new VBox();
vb.setStyle('borderStyle', 'solid');
vb.setStyle('borderColor', 'red');
vb.setStyle('borderThickness', 2);
vb.addChild(img);

Я работал над этой проблемой несколько дней и не могу найти решения. Любые идеи? Что мне не хватает?


person user175590    schedule 20.10.2009    source источник


Ответы (1)


Я использовал следующий обходной путь:

Я создал прослушиватель событий для экранного объекта img. Затем, после загрузки img, я вручную устанавливаю высоту и ширину изображения. Я знаю, какой должна быть высота (preHeight), чтобы она была жестко запрограммирована. Затем я вычисляю ширину и устанавливаю ее как ширину изображения. По какой-то причине мне пришлось использовать свойства explicitHeight и explicitWidth, чтобы наконец получить правильный размер.

Я надеюсь, что это помогает кому-то.

img.addEventListener(FlexEvent.CREATION_COMPLETE, onCreationComplete);

private function onCreationComplete(event:FlexEvent) : void
{
  img.addEventListener(Event.COMPLETE, onImageLoadComplete);
}

private function onImageLoadComplete(event:Event) : void
{
    var image:Image = event.currentTarget as Image;
    var preHeight:Number = 0;
    var h:uint = Bitmap(image.content).bitmapData.height;
    var w:uint = Bitmap(image.content).bitmapData.width;

    // Check height
    preHeight = h > 170 ? 170 : h;
    // Set the width
    img.explicitWidth = (preHeight * w)/h;
    img.explicitHeight = preHeight; 
}
person user175590    schedule 22.10.2009