我正在使用flash中的图像构建一个立方体。加载器加载图像的精灵图:
+----++----++----++----++----++----+
|frnt||rght||back||left||top ||bot |
| || || || || || |
+----++----++----++----++----++----+
我得到的错误是:
错误#2005:参数0的类型不正确。应该是BitmapData类型。
在front.draw(src, null, null, null, clip);
行上(通过注释掉代码并不收到错误确认)。但我不确定为什么。我将 src
定义为BitmapData
,trace
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无法处理超出一定大小的图像。
答案 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 == 0
和width == 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对象没有接收任何输入数据。