我正在尝试加载.SWF文件旁边的图像文件.像这样的东西:
var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.addEventListener(Event.COMPLETE, function(e:Event):void {
trace(typeof(loader.data));
graphic = spritemap = new Spritemap(loader.data, 32, 32);
...
}
Run Code Online (Sandbox Code Playgroud)
但这是我得到的输出:
object
[Fault] exception, information=Error: Invalid source image.
Run Code Online (Sandbox Code Playgroud)
事情是loader.data有图像的字节但不是BitmapData实例,这就是Spritemap所期望的.
如何转换为BitmapData?
谢谢
我认真地到处寻找,但找不到解决方案.我的应用程序可以轻松地将UTF字节作为XML文件保存在iOS和Android的允许缓存位置中.
但我无法弄清楚如何将Bitmap/BitmapData保存到同一缓存文件夹中的文件.创建文件很好....
_fs.open(_f, FileMode.WRITE);
//What goes in here to save the Bitmap?
_fs.close();
Run Code Online (Sandbox Code Playgroud)
任何有关这方面的帮助将不胜感激.
谢谢
更新:代码如下......
_smallLogo = Bitmap(_loader.content);
//this.addChild(_smallLogo);
var jpg:JPGEncoder = new JPGEncoder(100);
var bd:BitmapData = new BitmapData(_smallLogo.width, _smallLogo.height);
bd.draw(_smallLogo);
var ba:ByteArray = jpg.encode(bd);
//3
_fs.open(_f, FileMode.WRITE);
_fs.writeBytes( ba, 0, ba.length );
_fs.close();
Run Code Online (Sandbox Code Playgroud)
更新 - 答案
//SAVE
_smallLogo = Bitmap(_loader.content);
var jpg:JPGEncoder = new JPGEncoder(100);
var ba:ByteArray = jpg.encode(_smallLogo.bitmapData);
_fs.open(_f, FileMode.WRITE);
_fs.writeBytes( ba, 0, ba.length );
_fs.close();
Run Code Online (Sandbox Code Playgroud)
//OPEN
private function getLogo():void {
var ba:ByteArray = new ByteArray();
_fs.open(_f, …Run Code Online (Sandbox Code Playgroud) 我试图使用BitmapData和copyPixels方法获取部分舞台区域:
bmd = new BitmapData(stage.stageWidth, stage.stageHeight);
bmdRect = new BitmapData(320, 240);
rectangle = new Rectangle(360, 20, 320, 240);
bmdRect.copyPixels(bmd, rectangle, new Point());
bmd.draw(bmp);
bmp = new Bitmap(bmdRect);
var myEncoder:JPGEncoder = new JPGEncoder(100);
var byteArray:ByteArray = myEncoder.encode(bmd);
Run Code Online (Sandbox Code Playgroud)
我得到的结果是一个空的.jpg我很确定错误是在位图程序而不是保存的...
所以我一直在筛选Go标准库中的一些代码,试图理解他们的图像和颜色包,但发现了一些我无法理解的代码.来自http://golang.org/src/pkg/image/color/color.go?s=794:834#L14
根据我的理解,它应该将8位预先alpha乘法的RGB值转换为16位的值,保存在32位变量中,以防止它们在图像关节成像中相乘时溢出.
我无法理解的是像r |= r << 8我理解的线条这相当于r = r*2^8+r因为r << 8在右边插入零并且它们与旧的r相关.
对于r = 255的输入,这评估为65535 = 2 ^ 16 - 1这是预期的,但对于中间的值没有意义,这些值实际上没有映射到更大范围内的比例.例如,127 get被映射到32639,而我期望32767代表127.我错过了什么?我认为它与pre-alpha-multiplication有关...
func (c RGBA) RGBA() (r, g, b, a uint32) {
r = uint32(c.R)
r |= r << 8
g = uint32(c.G)
g |= g << 8
b = uint32(c.B)
b |= b << 8
a = uint32(c.A)
a |= a << 8
return
}
Run Code Online (Sandbox Code Playgroud) 我在AS3闪存中有一个位图,我使用base64编码的jpg字符串将其发送到javascript.
一切都很好.我需要将img发送到缩小版,然后旋转180度.缩放工作,但不是旋转.轮换永远不会.我知道我显然做错了,但不知道正确的方法.
所以基本上我只需要旋转图像180deg,所以当它被发送到javascript它是颠倒的.
这是我的转换代码
var scaleFactor:int = 5;
var tempBitmap:BitmapData = new BitmapData(img.width/scaleFactor, img.height/scaleFactor);
var drawMatrix:Matrix = new Matrix(1/scaleFactor, 0, 0, 1 /scaleFactor );
drawMatrix.rotate(Math.PI); //180deg
tempBitmap.draw(img, drawMatrix);
Run Code Online (Sandbox Code Playgroud) 我有一个包含4层的组件:(按升序排列)bgImage:Sprite,dropZone:Sprite,dropMask:Sprite和line:Sprite.bgImage为0,0,其他对象放置在各种正坐标处.dropMask正在屏蔽dropZone.
在位图捕获点我想只从dropZone和dropMask层绘制,所以我在尝试这个:
removeChild(bgImage);
removeChild(line);
var bmd:BitmapData = new BitmapData(dropMask.width,dropMask.height,true,0);
bmd.draw(this,null,null,null,dropMask.getBounds(this));
Run Code Online (Sandbox Code Playgroud)
尽管dropMask位于50,60,但捕获总是从0,0开始.我也试过获得边界矩形并强制x,y,但它没有区别.我在这里做错了什么,我应该忘记clipRect并使用矩阵代替吗?
我有一个代码来擦除蒙面动画片段.(在这里学分)我想知道如何检查整个动画片段是否已被删除.所以我认为我必须检查BitmapData是否为空,但我可能非常错!如何检查动画片段的每个像素是否已被删除?
当然我的下面的例子是错误的,但我认为它必须是这样的.
if (erasableBitmapData = empty)
{
trace("empty")
}
Run Code Online (Sandbox Code Playgroud)
var lineSize:Number=40;
var doDraw:Boolean=false;
var resumeDrawing:Boolean=false;
var erasableBitmapData:BitmapData = new BitmapData(700, 500, true, 0xFFFFFFFF);
var erasableBitmap:Bitmap = new Bitmap(erasableBitmapData);
erasableBitmap.cacheAsBitmap = true;
addChild(erasableBitmap);
maskee.cacheAsBitmap = true;
maskee.mask = erasableBitmap;
var eraserClip:Sprite = new Sprite();
initEraser();
function initEraser():void {
eraserClip.graphics.lineStyle(lineSize,0xff0000);
eraserClip.graphics.moveTo(stage.mouseX,stage.mouseY);
}
var drawnBitmapData:BitmapData = new BitmapData(700, 500, true, 0x00000000);
var drawnBitmap:Bitmap = new Bitmap(drawnBitmapData);
stage.addEventListener(MouseEvent.MOUSE_MOVE,maskMove);
stage.addEventListener(MouseEvent.ROLL_OUT, maskOut);
stage.addEventListener(MouseEvent.ROLL_OVER,maskOver);
stage.addEventListener(MouseEvent.MOUSE_DOWN,startDrawing);
stage.addEventListener(MouseEvent.MOUSE_UP,stopDrawing);
function startDrawing(e:MouseEvent):void {
eraserClip.graphics.moveTo(stage.mouseX,stage.mouseY);
doDraw=true;
}
function stopDrawing(e:MouseEvent):void { …Run Code Online (Sandbox Code Playgroud) 我有一个涉及加载透明png的问题.我想要做的是从加载的png复制alpha通道,然后将此alpha通道应用于另一个Bitmapdata对象.
谁能建议我怎么做?
这有效:
var a:BitmapData = new BitmapData(640,480);
var b:Bitmap = new Bitmap(a);
a.draw(movieClip);
Run Code Online (Sandbox Code Playgroud)
这不起作用:
movieClip.mask = movieClipMask;
var a:BitmapData = new BitmapData(640,480);
var b:Bitmap = new Bitmap(a);
a.draw(movieClip);
Run Code Online (Sandbox Code Playgroud)
如何只将MovieClip的可见部分(使用遮罩)绘制到我的位图中?