为什么这会抛出错误?

时间:2011-03-09 00:55:28

标签: actionscript-3 bitmapdata

我正在使用flash中的图像构建一个立方体。加载器加载图像的精灵图:

+----++----++----++----++----++----+
|frnt||rght||back||left||top ||bot |
|    ||    ||    ||    ||    ||    |
+----++----++----++----++----++----+

我得到的错误是:

  

错误#2005:参数0的类型不正确。应该是BitmapData类型。

front.draw(src, null, null, null, clip);行上(通过注释掉代码并收到错误确认)。但我不确定为什么。我 src定义为BitmapDatatrace src生成[object BitmapData]

private function loaderCompleteListener(e:Event):void
{
  log('Complete');
  var front:BitmapData,
    right:BitmapData,
    back:BitmapData,
    left:BitmapData,
    top:BitmapData,
    bottom:BitmapData,
    srcData:Bitmap,
    src:BitmapData,
    clip:Rectangle;

  try
  {
    srcData = this._imageLoader.content as Bitmap;
    src = srcData.bitmapData;
    front = new BitmapData(src.height, src.height, false, 0);
    right = new BitmapData(src.height, src.height, false, 0);
    back = new BitmapData(src.height, src.height, false, 0);
    left = new BitmapData(src.height, src.height, false, 0);
    top = new BitmapData(src.height, src.height, false, 0);
    bottom = new BitmapData(src.height, src.height, false, 0);
    clip = new Rectangle(0, 0, src.height, src.height);

    //This is the line that causes the error
    front.draw(src, null, null, null, clip); //<----
    clip.x += src.height;
    right.draw(src, null, null, null, clip);
    clip.x += src.height;
    back.draw(src, null, null, null, clip);
    clip.x += src.height;
    left.draw(src, null, null, null, clip);
    clip.x += src.height;
    top.draw(src, null, null, null, clip);
    clip.x += src.height;
    bottom.draw(src, null, null, null, clip);
  }
  catch ( e:Error )
  {
    log(e.message);
  }
}

我错过了什么?

编辑添加:

一个考虑因素可能是图像尺寸。我正在加载一张1866×11196的图像。我明天将测试一下,看看是否有更小的图像。可能只是Flash无法处理超出一定大小的图像。

4 个答案:

答案 0 :(得分:2)

bitmapdata的最大宽度或长度为8192,但如以下链接所述,并非两者都有。即总像素数不能超过16,777,215像素。

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html

答案 1 :(得分:2)

正如Chris指出的那样,对于任何BitmapData,高度或宽度的内置最大值都是8192,因此您将无法原生使用宽度为11196的图像。

但是,有一些解决方法,例如BitmapDataUnlimited类,您可以找到here

答案 2 :(得分:1)

首先,我要感谢@Chris,@ EyeSeeEm,@ Nathan Ostgard带领我收到错误的原因。我的期望是如果图像没有正确加载(这至少对我来说似乎是一个IO错误)会收到一个IOErrorEvent.IO_ERROR,但Flash显然没有认为那个足够了,这就是我为什么得到一个虚假的错误。

正如大家所指出的,AS3文档指定图像不能超过特定大小。

Flash Player 9:

  

BitmapData对象的最大宽度和最大高度为2880像素。

Flash Player 10:

  

在AIR 1.5和Flash Player 10中,BitmapData对象的最大大小为宽度或高度为8,191像素,总像素数不能超过16,777,215像素。 (因此,如果BitmapData对象的宽度为8,191像素,则其高度仅为2,048像素。)在Flash Player 9及更早版本以及AIR 1.1及更早版本中,限制为高度为2,880像素,宽度为2,880像素。

但重要的原因我得到ArgumentError似乎没有意义的是CS4 docs中的下一行:

  

如果BitmapData对象无效(例如,如果它具有height == 0width == 0)或者已通过{处理掉它,则调用BitmapData对象的任何方法或属性会抛出ArgumentError错误{1}}。

因为我的图片比dispose()宽,所以它被认为是无效的,导致了一个不可思议的8191px

这在ArgumentError调用的上下文中有意义,但仍无法解释为什么我可以在不触发错误的情况下调用draw

答案 3 :(得分:0)

错误实际上是'参数0的类型不正确。应该是类型IBitmapDrawable' - 而不是BitmapData。 (好吧,我的机器)。

但是BitmapData确实是IBitmapDrawable - 问题在于一个对象被输入为某个尚未构造的类,或者equals null实际上并没有实现任何东西。

// Example
var src:BitmapData;
trace(src is IBitmapDrawable); // false

在您的情况下,如果srcData(Bitmap对象)没有bitmapData,它将返回null并且src(BitmapData)设置为null。因此,当null传递给draw()时,它会变坏,因为null不是IBitmapDrawable。

例如,如果我执行以下操作:

var o:BitmapData = new BitmapData(100, 100, false, 0);
o.fillRect(new Rectangle(0, 0, 100, 100), 0x334455);

var srcData:Bitmap = new Bitmap(o);
var src:BitmapData;

src = srcData.bitmapData;

trace(src is IBitmapDrawable);

var front:BitmapData = new BitmapData(100, 100, false, 0);
front.draw(src as IBitmapDrawable); // works!

但是如果我从srcData中删除o(bitmapdata),例如:

var srcData:Bitmap = new Bitmap();
var src:BitmapData;

src = srcData.bitmapData;

trace(src is IBitmapDrawable);

var front:BitmapData = new BitmapData(100, 100, false, 0);
front.draw(src as IBitmapDrawable); // Doesn't work!

再次,在您的情况下,Bitmap对象没有接收任何输入数据。