如何使用 as3 将 jpg 图像保存到 Android 手机

Posted

技术标签:

【中文标题】如何使用 as3 将 jpg 图像保存到 Android 手机【英文标题】:How to save a jpg image to android phone with as3 【发布时间】:2013-08-31 00:08:28 【问题描述】:

我正在尝试将图像保存到我的 android 手机是一个特定的目录。 不知何故,我花了几个小时,但无法让它工作。我希望有人可以帮助我理解为什么我的代码无法正常工作,或者是否有其他方法可以做到这一点。

public function SaveTheImage(me:MouseEvent):void
       
    ImageSaverBMD.draw(ImageHolder);

    var jpgEncoder:JPGEncoder = new JPGEncoder(100);
    var jpgBytes:ByteArray = jpgEncoder.encode(ImageSaverBMD);

    var myFile:File = File.documentsDirectory.resolvePath("/sdcard / DCIM / Camera/testingimage.jpg");
    var fs:FileStream = new FileStream();
    fs.open(myFile, FileMode.WRITE);
    fs.writeBytes(jpgBytes, 0, jpgBytes.length);
    fs.close();  

【问题讨论】:

请更准确!您是否已在 Manifest 上声明了权限?您的应用程序在启动时崩溃了吗?你的 logcat 显示了什么?什么... 【参考方案1】:

您的算法中有许多步骤可能会导致错误,根据您提供的代码我可以做出一些猜测,但有更好的方法。

首先试试这段代码:

var s:Shape = new Shape();
s.graphics.beginFill(0);
s.graphics.drawCircle( 20, 20, 20);
s.graphics.endFill();

var bd:BitmapData = new BitmapData(40, 40, false);
bd.draw(s);

var jpgEncoder:JPGEncoder = new JPGEncoder(100);
var bytes:ByteArray = jpgEncoder.encode(bd);

var f:File = File.applicationDirectory;
var fs:FileStream = new FileStream();
fs.open(f, FileMode.WRITE);
fs.writeBytes(bytes);
fs.close();

这应该会在您提供的目录中保存一个 80x80 像素的黑色圆圈。看看它是否有效。如果没有:检查是否拥有外部存储的权限。

如果可行,开始从上到下逐块删除代码:

删除顶部的两个块并放入您的ImageSaverBMD.draw(ImageHolder) 行。也许问题出在那个班级?可能是位图数据大小错误或绘制矩阵的平移不正确。

JPGEncoder 应该没问题,它是一个常用的框架,但有时当我将它复制到我的源文件中时,我需要更改 .as 文件中的包。你的包裹正确吗?

您在 File 对象中的 URL 有空格,这可能是您的问题,请先尝试使用简单的 URL,看看是否可行。这可能是您尝试使用相对 URL 模式导航到绝对 URL 的问题(我可能错了,通常我有不同的导航到文件夹的方法)。

希望有帮助!

【讨论】:

非常感谢,我会尝试您的代码我希望将图片添加到相机胶卷图像中如何进入该目录?从您的代码中,我了解到该文件将保存到应用程序目录中,我能否在我使用 air for android 的相机胶卷中看到它。再次非常感谢您的回答。 好的,发现问题唯一的问题是解析路径可能是错误的路径,除了这一切都很好。现在下一个问题是刷新画廊我需要关闭设备才能看到相机胶卷中的图片所以我需要使用扩展刷新画廊但没有如何使用它的示例......(为什么一切都必须有问题...) 如果您当前有关保存文件的问题得到解答,我会说接受此答案并提出有关您的扩展名的问题,您更有可能在评论中得到答案不同的事情将是题外话。 感谢您的所有帮助我成功地将图像保存到文件但我面临另一个问题,保存的图像放在一边有没有办法保存正确的文件? 旋转对象,然后从中制作一个 BitmapData 对象并保存。【参考方案2】:
private function export():void


        var today_date:Date = new Date();
        var thismonth:uint = today_date.getMonth();
        var today_time;
        var currentTime:Date = new Date();
        var minutes = currentTime.getMinutes();
        var seconds = currentTime.getSeconds();
        var hours = currentTime.getHours() * 30 + currentTime.getMinutes() / 2;

        var mnth:Array = new Array('January','February','March','April','May','June','July','August','September','October','November','December');
        var fileName:String = (today_date.getDate()+mnth[thismonth]+today_date.getFullYear()+"_"+currentTime.hours + currentTime.minutes + currentTime.seconds+".png");
        //trace(fileName);// displays current date in United States date format
        var bmd:BitmapData = new BitmapData(board.width, board.height);//(600, 290);

        bmd.draw(board);

        var ba:ByteArray = PNGEncoder.encode(bmd);
       // var file:File = File.applicationDirectory;
        //var file:FileReference = new FileReference();
        var fs : FileStream = new FileStream();
        var targetFile : File = File.documentsDirectory.resolvePath(fileName);
        //var targetFile : File = File.applicationDirectory.resolvePath(fileName);
        fs.open(targetFile, FileMode.WRITE);
        fs.writeBytes(ba);
        fs.close();

        //file.addEventListener(Event.COMPLETE, saveSuccessful);
        saveDialog = new SaveDialog();

        addChild(saveDialog);
        test = setInterval(showMessage,2000);
        //var test = setInterval(showMessage,3000);
        saveDialog.closeBtn.addEventListener(MouseEvent.MOUSE_UP, closeSaveDialog);
        //file.save(ba, fileName);
    

【讨论】:

以上是关于如何使用 as3 将 jpg 图像保存到 Android 手机的主要内容,如果未能解决你的问题,请参考以下文章

请问AS3.0 怎样可以将Bitmap对象保存为本地图片文件(如JPG文件)。谢谢!

如何将png图像保存到相机胶卷?

将画布作为 jpg 文件保存到服务器时如何增加 DPI?

如何在 iOs 或 Android air 项目 (AS3) 上将下载的资产保存到磁盘

AS3 > 按顺序显示数组图像的按钮?

添加按钮以将图片保存到AIR或AS3中