为什么我的调整大小代码失败了?

时间:2011-06-21 20:42:15

标签: flash actionscript

情况是,这个调整大小的代码一直对我有用,因为我使用的是本地图像。我现在正在使用第三方管理员,该管理员通过application/octet-stream提供图片。

以前,我使用Loader::load方法加载图像,但我目前正在使用Loader::loadBytes来加载二进制数据,因为我正在使用流而不是image/jpeg

通过切换到流,代码现在无法通过这一行:

resizedImageData.copyPixels(e.currentTarget.getChildAt(0).bitmapData, cropRect, new Point(0, 0));

在此片段中:

    if((postcardWidth != postcardImage.width || postcardHeight != postcardImage.height) ) {
        ExternalInterface.call( "console.log" , "IF");

        var resizedImageData:BitmapData = new BitmapData(postcardWidth, postcardHeight);
                    ExternalInterface.call( "console.log" , "IF2");

        var cropRect:Rectangle = new Rectangle(e.currentTarget.width / 2 - postcardWidth / 2, e.currentTarget.height / 2 - postcardHeight / 2, postcardWidth, postcardHeight);

                    ExternalInterface.call( "console.log" , "IF3");

        resizedImageData.copyPixels(e.currentTarget.getChildAt(0).bitmapData, cropRect, new Point(0, 0));

                    ExternalInterface.call( "console.log" , "IF4");


        var resizedImage:Bitmap = new Bitmap(resizedImageData);

                    ExternalInterface.call( "console.log" , "IF5");

        postcardFront.addChild(resizedImage);

                    ExternalInterface.call( "console.log" , "IF6");

    } else {
        ExternalInterface.call( "console.log" , "ELSE");
        postcardFront.addChild(postcardImage);
    }

postcardWidth总是680,postcardImage.width是600,po​​stcardHeight是442,postcardImage.height是429。

似乎唯一的罪魁祸首可能是不一致bitmapData

我使用diff对工作jpeg和非工作jpeg进行了比较,并在vim中将它们打开,并且它们以相同的字符开头,以相同的字符结尾,并且看起来是100%相同且跨越相同的行数(二进制数据)。

有没有人知道为什么这条线可以在一张图片上工作而不在另一张图片上呢?

更多代码

loadBytes方法在此处:http://pastie.org/private/h463eu7cbx1vnhtxzq8xyg。此代码段位于外部.as文件中。

此代码来自fla,并且更多的是我在问题上方粘贴的原始代码段中的代码:http://pastie.org/private/vmwp4sw8urupdx91qny4w

1 个答案:

答案 0 :(得分:2)

好的,在你在pastie.org上粘贴的代码之后,我在我的头上重新创建了Image类并运行了一些测试。似乎有三件事情是问题所在。第一个是行:

e.currentTarget.getChildAt(0).bitmapData

发送Image的{​​{1}}类,意味着它是Event.COMPLETE。我从该类中收集的第一个孩子是您添加的currentTarget对象。 Loader没有Loader对象,因此这个对象将抛出“无法从null对象错误访问属性”。

第二件事是,假设您打算在此处定位bitmapData对象,Image是您在函数{{1}中创建的bitmapData对象(来自http://pastie.org/private/h463eu7cbx1vnhtxzq8xyg),BitmapData没有公开访问权限。在我的课程版本中,我添加了一个getter。

第三,makeBitmapData()事件在调用BitmapData之前被调度,这意味着即使你可以访问它,它也是空的。

当您使用Event.COMPLETE来记录消息时,我假设这是在浏览器中运行而您没有运行调试Flash播放器,因此您不会看到{的错误{1}}为null,因此makeBitmapData()调用中的一个参数为null(这会抛出异常停止swf的进度)。

如果您想测试它,我使用的ExternalInterface类(它适用于我的目的):

bitmapData

主要课程:

copyPixels

这样可以解决吗?