将位图保存到文件-Xamarin,Monodroid

8

我正在尝试将位图图像保存到我的手机内的一个目录(画廊)。这个应用程序是使用Xamarin开发的,因此代码是C#。

我似乎无法弄清楚如何创建一个目录并保存一个位图。有什么建议吗?

public void createBitmap(View view){ 
    view.DrawingCacheEnabled = true; 
    view.BuildDrawingCache (true); 
    Bitmap m_Bitmap = view.GetDrawingCache(true);

    String storagePath = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath;
    Java.IO.File storageDirectory = new Java.IO.File(storagePath);
    //storageDirectory.mkdirs ();


    //save the bitmap
    //MemoryStream stream = new MemoryStream ();
    //m_Bitmap.Compress (Bitmap.CompressFormat.Png, 100, stream);
    //stream.Close();


    try{

        String filePath = storageDirectory.ToString() + "APPNAME.png";
        FileOutputStream fos = new FileOutputStream (filePath);
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        m_Bitmap.Compress (Bitmap.CompressFormat.Png, 100, bos);
        bos.Flush();
        bos.Close();
    } catch (Java.IO.FileNotFoundException e) {
        System.Console.WriteLine ("FILENOTFOUND");
    } catch (Java.IO.IOException e) {
        System.Console.WriteLine ("IOEXCEPTION");
    }
2个回答

24

这里是一种简单的方法,只使用C#工具即可将Bitmap导出为PNG文件到SD卡中:

void ExportBitmapAsPNG(Bitmap bitmap)
{
    var sdCardPath = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath;
    var filePath = System.IO.Path.Combine(sdCardPath, "test.png");
    var stream = new FileStream(filePath, FileMode.Create);
    bitmap.Compress(Bitmap.CompressFormat.Png, 100, stream);
    stream.Close();
}

1
如何在不压缩的情况下编写原始BMP数据? - gonzobrains
@gonzobrains 我不知道那是否可能,也不知道如何做到。抱歉。 - kaolick
3
你应该使用".Dispose()"释放内存中的steam和bitmap,或者更好的方法是使用"using(){}"。 - Wessam El Mahdy
当我压缩它时,图像的质量会降低。有没有一种方法可以保存而不经过此压缩功能?此外,@testing发布的帖子仅显示通过将其传递给压缩函数来转换为字节数组。 - Fnr
1
@Fabiotk:你尝试过CopyPixelsToBuffer()了吗?这里有一篇相关的帖子。 - testing
@Fabiotk 另一个你可以尝试的选项是 GetByteArrayFromImage()。 - xanderh

3

变更:

String filePath = storageDirectory.ToString() + "APPNAME.png";

致:

String filePath = Path.Combine(storageDirectory.ToString(), "APPNAME.png");

您的原始代码将文件名附加到路径名称中的最后一个文件夹,而不添加路径分隔符。例如,路径为\data\data\sdcard01会创建一个文件路径\data\data\sdcard01APPNAME.png。使用Path.Combine()可以确保在附加目录时使用路径分隔符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接