从已解码的ByteArray调整图像大小

时间:2009-10-20 13:41:28

标签: flex image resize bytearray

我正在尝试将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)高度进行硬编码,则会调整已调整大小的图像,但会在具有原始图像尺寸的框内。

例如,如果原始图像的高度为300px,宽度为200px,则img.height属性设置为75;高度为75的已调整大小的图像正确显示。但调整大小的图像显示在img容器的左上角,仍然设置为300px的高度和200px的宽度。为什么这样做?什么是修复?

说明问题的最佳方法是将图像放在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);

我已经解决了这个问题好几天了,无法提出解决方案。有任何想法吗?我错过了什么?

1 个答案:

答案 0 :(得分: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; 
}