2015-05-27 36 views
0

我從一個服務器上獲得一個圖像,大小約爲15MB,但我想保持長寬比但壓縮文件的大小,因爲我正在加載大約相同大小的多個文件?這些圖像被下載爲BitMaps和使用SetImageBitmap來顯示圖像如何壓縮圖像但不調整其大小使用Xamarin Android?

+0

爲了澄清,你想在磁盤上壓縮文件的大小或減少一般圖像的尺寸(寬度和高度)? – matthewrdev

+0

我只想壓縮文件大小,而不是更改尺寸。 – Ash

回答

-1

您可以使用其他文件格式(例如jpeg)壓縮圖像。 或者您可以在保持縱橫比的同時調整圖像大小。

1

你可以通過將圖像轉換爲JPEG或PNG來做到這一點。這是快速和骯髒的實施位圖PNG轉換例程的:

​​

它的前提上的文件擴展名,但可以很容易修改。

這裏是我用來驗證壓縮的全樣本:

public class MainActivity : Activity 
{ 
    public const string BITMAP_URL = @"http://www.openjpeg.org/samples/Bretagne2.bmp"; 


    public string ResizeImage(string sourceFilePath) 
    { 
     Android.Graphics.Bitmap bmp = Android.Graphics.BitmapFactory.DecodeFile (sourceFilePath); 

     string newPath = sourceFilePath.Replace(".bmp", ".png"); 
     using (var fs = new FileStream (newPath, FileMode.OpenOrCreate)) { 
      bmp.Compress (Android.Graphics.Bitmap.CompressFormat.Png, 100, fs); 
     } 

     return newPath; 
    } 

    protected override void OnCreate (Bundle bundle) 
    { 
     base.OnCreate (bundle); 

     SetContentView (Resource.Layout.Main); 

     Button button = FindViewById<Button> (Resource.Id.myButton); 

     button.Click += delegate { 
      System.Threading.Tasks.Task.Run(() => { 
       RunOnUiThread(() => Toast.MakeText(this, "Downloading file", ToastLength.Long).Show()); 

       string downloadFile = DownloadSourceImage(BITMAP_URL); 

       RunOnUiThread(() => Toast.MakeText(this, "Rescaling image: " + downloadFile, ToastLength.Long).Show()); 

       string convertedFile = ResizeImage(downloadFile); 

       var bmpFileSize = (new FileInfo(downloadFile)).Length; 
       var pngFileSize = (new FileInfo(convertedFile)).Length; 

       RunOnUiThread(() => Toast.MakeText(this, "BMP is " + bmpFileSize + "B. PNG is " + pngFileSize + "B.", ToastLength.Long).Show()); 
      }); 
     }; 
    } 

    public string DownloadSourceImage(string url) 
    { 
     System.Net.WebClient client = new System.Net.WebClient(); 

     string fileName = url.Split ('/').LastOrDefault(); 
     string downloadedFilePath = Path.Combine(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath, fileName); 

     if (File.Exists (downloadedFilePath) == false) { 
      client.DownloadFile (url, downloadedFilePath); 
     } 

     return downloadedFilePath; 
    } 
} 
相關問題