Android-將圖檔設定至Canvas Bitmap的注意事項


例如要畫一個直方圖,因為底圖都是一樣的,想說不要每次都繪底圖,只要針對直方圖的數值重新繪製就好,看能不能爭取一些繪圖的時間,所以個想到的方式就是將第一次繪製好的圖,先存到Internal Storage,等到下次要繪圖時,就直接讀取Internal Strorage的檔案至Canvas的Bitmap Source,以省去繪制底圖的時間。那該如何儲存圖片至Internal Storage呢?方法如下:

 

    • 取得Internal Storage的files資料夾
    • 設定檔名並寫入檔案
  1. /* 設定背景圖Bitmap物件 */
  2. Bitmap bmpTrendChart = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_4444);
  3.  
  4. /* 儲存背景圖片,當中 this.getContext().openFileOutput(),會在產生一個FileOutputStream,指定的位置是Internal Storage的files資料夾下
  5. 設定檔名時,不能夠有"/"符號,否則會產生separator exception */
  6. bmpTrendChart.compress(CompressFormat.PNG, 100, this.getContext().openFileOutput("image.png", Context.MODE_PRIVATE));

 

沒想到發生了 java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructor,字面上的意思就是說,不可改變的bitmap。造成的原因是因為你載入Internal Storage的是不可被修改的。所以解決的方式為使用copy的方式,複製一份圖檔給Canvas就能解決了

  1. /* 取得圖檔實際位置,當中的this.getContext().getFilesDirs()是取得app的internal storage的資料夾位置 */
  2. String filePath = new File(this.getContext().getFilesDir(), "image.png").getAbsolutePath();
  3.  
  4. /* 使用copy的方式,解決 java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructor 的問題 */
  5. Bitmap bmpTrendChart = BitmapFactory.decodeFile(filePath).copy(Bitmap.Config.ARGB_4444, true);
  6. Canvas canvas = new Canvas(bmpTrendChart);

 

但最後的測試結果發現,如果繪製一次圖,儲存至app內部空間後,再重新繪製圖片時並載入圖片時,因為有用到IO,所以app的執行速度變慢了,最後還是改回不儲存圖片的方式繪製圖片。少了IO這一層,速度也比較快了。

 

 






[本日志由 FindSome 于 2014-08-06 05:05 PM 编辑]
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: Android 圖檔 設定 Canvas Bitmap 注意事項
相關日誌:

评论: 0 | 引用: 0 | 查看次数: 3011
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 关闭 | [img]标签 关闭