Saving Bitmap to File - Xamarin, Monodroid


Solution 1

This here is a slim way to export a Bitmap as PNG-file to the sd-card using only C# stuff:

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);

Solution 2


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


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

Your original code appends the file name to the last folder in the path name without adding a path separator. For example, path of \data\data\sdcard01 would create a file path of \data\data\sdcard01APPNAME.png. Using Path.Combine() ensures that a path separator is used when appending directories.

Author by


Updated on July 09, 2022


  • Coova
    Coova 11 months

    I am trying to save a bitmap image to a directory (gallery) inside my phone. The app is being developed in Xamarin so the code is C#.

    I cant seem to figure out how to make a directory, and save a Bitmap. Any suggestions?

    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);
            String filePath = storageDirectory.ToString() + "APPNAME.png";
            FileOutputStream fos = new FileOutputStream (filePath);
            BufferedOutputStream bos = new BufferedOutputStream(fos);
            m_Bitmap.Compress (Bitmap.CompressFormat.Png, 100, bos);
        } catch (Java.IO.FileNotFoundException e) {
            System.Console.WriteLine ("FILENOTFOUND");
        } catch (Java.IO.IOException e) {
            System.Console.WriteLine ("IOEXCEPTION");
  • gonzobrains
    gonzobrains almost 7 years
    how do you write out the raw bmp data without compressing?
  • kaolick
    kaolick almost 7 years
    @gonzobrains I don't know if or how that's possible. Sorry.
  • Wessam El Mahdy
    Wessam El Mahdy over 5 years
    You should release steam and bitmap from memory by using ".Dispose()" or it may be better to use "using(){}".
  • Fnr
    Fnr over 5 years
    when I compress it I'm losing the quality of the image. is there a way to save it without passing to this compress function? Also, the post @testing showed only shows to convert to byte array by passing it to the compress function.
  • testing
    testing over 5 years
    @Fabiotk: Have you tried CopyPixelsToBuffer()? Here is a post about this.
  • xanderh
    xanderh almost 4 years
    @Fabiotk another option you might try is GetByteArrayFromImage().