【问题标题】:Flash/ActionScript3 crashes on getPixel/32Flash/ActionScript3 在 getPixel/32 上崩溃
【发布时间】:2010-03-18 20:35:40
【问题描述】:

问题:下面的代码闪退... 为什么?

导致崩溃的线条似乎是


//var uiColor:uint = bmpd.getPixel(i,j);
var uiColor:uint = bmpd.getPixel32(i,j);
trace("颜色:"+ uiColor);

我正在尝试拍摄影片剪辑的快照并遍历图像中的所有像素并获取像素的颜色。

import flash.display.BitmapData;
import flash.geom.*;


function takeSnapshot(mc:MovieClip):BitmapData 
{
var sp:BitmapData = new BitmapData(mc.width, mc.height, true, 0x000000);
sp.draw(mc, new Matrix(), new ColorTransform(), "normal");
return sp;
}

var mcMyClip:MovieClip=new MovieClip()
var xxx:cMovieClipLoader=new cMovieClipLoader(); 

xxx.LoadImageAbsSize(mcMyClip,"http://localhost/flash/images/picture.gif", 500,500)

//this.addChild(mcMyClip);

function WhenImageIsLoaded()
{
var bmpd:BitmapData=takeSnapshot(mcMyClip);

var i,j:uint;

for(i=0; i < bmpd.width;++i)
{
    for(j=0; j < bmpd.height;++j)
    {
        //var uiColor:uint = bmpd.getPixel(i,j);
        var uiColor:uint = bmpd.getPixel32(i,j);
        trace("Color: "+ uiColor);
    }
}


var myBitmap:Bitmap = new Bitmap(bmpd);



this.addChild(myBitmap);
}

setTimeout(WhenImageIsLoaded,1000);

【问题讨论】:

  • 你说的“崩溃闪现”到底是什么意思?
  • 刚刚在 fla 中运行代码,对我来说一切正常。我在 Mac 上运行 CS4。看起来这更像是 Flash IDE/环境问题而不是代码问题。
  • 是的,您的意思是 Vista x64 问题。我已经放弃提交错误报告,我还需要做其他事情 ;-))
  • 你能发布堆栈跟踪吗?您可以在启用调试的情况下发布它吗?这将准确地告诉您错误发生在哪一行。

标签: flash actionscript-3 actionscript


【解决方案1】:

getPixel 调用是否有效,而不是 getPixel32?沙盒情况如何?您是否有足够的“权限”来访问位图作为数据?也许您需要一个 LoaderContext 来传递给正在加载图像的 Loader?您是否跟踪/调试了位图数据大小以查看其实际大小?

【讨论】:

    【解决方案2】:

    解决了。

    一次有3个问题:
    1. 有透明度,所以只有GetPixel32有效
    2. mcMyClip.width & height 返回错误值 mcMyClip.getBounds(mcMyClip).width & height 返回正确值(因为原来的movieclip是调整大小的)
    3. 800x600图片= 480'000点* 1瞬间的trace消息,这就是崩溃的原因(其实可能是Vista的问题...)

    【讨论】:

    • 对于#0,0x000000 与 0x0000000 完全相同。也等价:0x0, 0, (24/6-9+5)。对于 #1,您可以在不透明的 BitmapData 上调用 getPixel,它只是不给您 alpha 数据。
    • 对于#2,您可以在 BitmapData.draw() 调用中为矩阵参数传递 mcMyClip.transform.matrix。
    • 对于#3,试试 if (i%16==0 && i%16==0) { trace(...); } // 仅每 256 个像素跟踪一次
    • @aaaidan:我前段时间发现:我使用的 MovieClip 只有 Alpha 数据(没有颜色,一切都是 0,0,0,只有 alpha 值不同)!
    【解决方案3】:

    不知道是不是这么简单,但你试过在 for 循环条件中使用 bmdp.width - 1 吗?

    【讨论】:

      【解决方案4】:

      BitMapData 的构造函数的第四个参数是 ARGB 颜色值(例如,0x00000000 - 八位数字),而不是 RGB 值(例如,0x000000 - 六位数字)。也许这就是你的问题:你没有提供 Alpha 通道值。

      【讨论】:

      • 将 0 附加到 0x0 不会改变它的值;它仍然是 0。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-30
      • 2020-03-17
      • 1970-01-01
      • 2011-03-20
      • 2014-04-08
      相关资源
      最近更新 更多