天天看點

Android筆記:bitmap轉換與處理相關工具類,Bitmap與DrawAble與byte[]與InputStream之間的轉換

1.将view轉為bitmap

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

<code>// 将view轉為bitmap</code>

<code>public</code> <code>static</code> <code>Bitmap getBitmapFromView(View view)</code>

<code>{</code>

<code>    </code><code>// Define a bitmap with the same size as the view</code>

<code>    </code><code>Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);</code>

<code>    </code><code>// Bind a canvas to it</code>

<code>    </code><code>Canvas canvas = </code><code>new</code> <code>Canvas(returnedBitmap);</code>

<code>    </code><code>// Get the view's background</code>

<code>    </code><code>Drawable bgDrawable = view.getBackground();</code>

<code>    </code><code>if</code> <code>(bgDrawable != </code><code>null</code><code>)</code>

<code>        </code><code>// has background drawable, then draw it on the canvas</code>

<code>        </code><code>bgDrawable.draw(canvas);</code>

<code>    </code><code>else</code>

<code>        </code><code>// does not have background drawable, then draw white background on</code>

<code>        </code><code>// the canvas</code>

<code>        </code><code>canvas.drawColor(Color.WHITE);</code>

<code>    </code><code>// draw the view on the canvas</code>

<code>    </code><code>view.draw(canvas);</code>

<code>    </code><code>// return the bitmap</code>

<code>    </code><code>return</code> <code>returnedBitmap;</code>

<code>}</code>

2.将view轉為bitmap

<code>public</code> <code>static</code> <code>Bitmap viewToBitmap(View view)</code>

<code>    </code><code>view.setDrawingCacheEnabled(</code><code>true</code><code>);</code>

<code>    </code><code>view.buildDrawingCache();</code>

<code>    </code><code>Bitmap bm = view.getDrawingCache();</code>

<code>    </code><code>return</code> <code>bm;</code>

3.将xml轉為bitmap

<code>// 将xml轉為bitmap</code>

<code>public</code> <code>static</code> <code>Bitmap convertBitmapFromXML(Context context, String clusterSize, Bitmap bm)</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                       </code> 

<code>    </code><code>View layout = LayoutInflater.from(context).inflate(R.layout.estatecartlist_item, </code><code>null</code><code>);</code>

<code>    </code><code>View bitmapView = layout.findViewById(R.id.estatecartlist_item_bitmap);</code>

<code>    </code><code>TextView xml_text = (TextView) layout.findViewById(R.id.item_estatecart_tv_name);</code>

<code>    </code><code>ImageView image = (ImageView) layout.findViewById(R.id.item_estatecart_iv_main);</code>

<code>    </code><code>image.setImageBitmap(bm);</code>

<code>    </code><code>xml_text.setText(clusterSize);</code>

<code>    </code><code>bitmapView.measure(MeasureSpec.makeMeasureSpec(</code><code>0</code><code>, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(</code><code>0</code><code>, MeasureSpec.UNSPECIFIED));</code>

<code>    </code><code>bitmapView.layout(</code><code>0</code><code>, </code><code>0</code><code>, bitmapView.getMeasuredWidth(), bitmapView.getMeasuredHeight());</code>

<code>    </code><code>final</code> <code>Bitmap clusterBitmap = Bitmap.createBitmap(bitmapView.getMeasuredWidth(), bitmapView.getMeasuredHeight(), Bitmap.Config.ARGB_8888);</code>

<code>    </code><code>Canvas canvas = </code><code>new</code> <code>Canvas(clusterBitmap);</code>

<code>    </code><code>bitmapView.draw(canvas);</code>

<code>    </code><code>return</code> <code>clusterBitmap;</code>

==============參考資料===================

* 1.http://stackoverflow.com/questions/7200535/how-to-convert-views-to-bitmap

* 2.http://stackoverflow.com/questions/5536066/convert-view-to-bitmap-on-android/9595919#9595919

* 3.http://stackoverflow.com/questions/12402392/android-converting-xml-view-to-bitmap-without-showing-it

4.圖檔縮放與壓縮

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

<code>// 按大小縮放</code>

<code>private</code> <code>Bitmap getimage(String srcPath)</code>

<code>    </code><code>BitmapFactory.Options newOpts = </code><code>new</code> <code>BitmapFactory.Options();</code>

<code>    </code><code>// 開始讀入圖檔,此時把options.inJustDecodeBounds 設回true了</code>

<code>    </code><code>newOpts.inJustDecodeBounds = </code><code>true</code><code>;</code>

<code>    </code><code>Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts);</code><code>// 此時傳回bm為空</code>

<code>                                                                                                                                                                                                                                                                                                                                                                              </code> 

<code>    </code><code>newOpts.inJustDecodeBounds = </code><code>false</code><code>;</code>

<code>    </code><code>int</code> <code>w = newOpts.outWidth;</code>

<code>    </code><code>int</code> <code>h = newOpts.outHeight;</code>

<code>    </code><code>// 現在主流手機比較多是800*480分辨率,是以高和寬我們設定為</code>

<code>    </code><code>float</code> <code>hh = 800f;</code><code>// 這裡設定高度為800f</code>

<code>    </code><code>float</code> <code>ww = 480f;</code><code>// 這裡設定寬度為480f</code>

<code>    </code><code>// 縮放比。由于是固定比例縮放,隻用高或者寬其中一個資料進行計算即可</code>

<code>    </code><code>int</code> <code>be = </code><code>1</code><code>;</code><code>// be=1表示不縮放</code>

<code>    </code><code>if</code> <code>(w &gt; h &amp;&amp; w &gt; ww)</code>

<code>    </code><code>{</code><code>// 如果寬度大的話根據寬度固定大小縮放</code>

<code>        </code><code>be = (</code><code>int</code><code>) (newOpts.outWidth / ww);</code>

<code>    </code><code>}</code>

<code>    </code><code>else</code> <code>if</code> <code>(w &lt; h &amp;&amp; h &gt; hh)</code>

<code>    </code><code>{</code><code>// 如果高度高的話根據寬度固定大小縮放</code>

<code>        </code><code>be = (</code><code>int</code><code>) (newOpts.outHeight / hh);</code>

<code>    </code><code>if</code> <code>(be &lt;= </code><code>0</code><code>)</code>

<code>        </code><code>be = </code><code>1</code><code>;</code>

<code>    </code><code>newOpts.inSampleSize = be;</code><code>// 設定縮放比例</code>

<code>    </code><code>// 重新讀入圖檔,注意此時已經把options.inJustDecodeBounds 設回false了</code>

<code>    </code><code>bitmap = BitmapFactory.decodeFile(srcPath, newOpts);</code>

<code>    </code><code>return</code> <code>compressImage(bitmap);</code><code>// 壓縮好比例大小後再進行品質壓縮</code>

<code>// 圖檔品質壓縮</code>

<code>private</code> <code>static</code> <code>Bitmap compressImage(Bitmap image)</code>

<code>    </code><code>ByteArrayOutputStream baos = </code><code>new</code> <code>ByteArrayOutputStream();</code>

<code>    </code><code>image.compress(Bitmap.CompressFormat.JPEG, </code><code>100</code><code>, baos);</code><code>// 品質壓縮方法,這裡100表示不壓縮,把壓縮後的資料存放到baos中</code>

<code>    </code><code>int</code> <code>options = </code><code>100</code><code>;</code>

<code>    </code><code>while</code> <code>(baos.toByteArray().length / </code><code>1024</code> <code>&gt; </code><code>100</code><code>)</code>

<code>    </code><code>{ </code><code>// 循環判斷如果壓縮後圖檔是否大于100kb,大于繼續壓縮</code>

<code>        </code><code>baos.reset();</code><code>// 重置baos即清空baos</code>

<code>        </code><code>image.compress(Bitmap.CompressFormat.JPEG, options, baos);</code><code>// 這裡壓縮options%,把壓縮後的資料存放到baos中</code>

<code>        </code><code>options -= </code><code>10</code><code>;</code><code>// 每次都減少10</code>

<code>    </code><code>ByteArrayInputStream isBm = </code><code>new</code> <code>ByteArrayInputStream(baos.toByteArray());</code><code>// 把壓縮後的資料baos存放到ByteArrayInputStream中</code>

<code>    </code><code>Bitmap bitmap = BitmapFactory.decodeStream(isBm, </code><code>null</code><code>, </code><code>null</code><code>);</code><code>// 把ByteArrayInputStream資料生成圖檔</code>

<code>    </code><code>return</code> <code>bitmap;</code>

<code>// 圖檔按比例大小壓縮</code>

<code>private</code> <code>static</code> <code>Bitmap comp(Bitmap image)</code>

<code>    </code><code>image.compress(Bitmap.CompressFormat.JPEG, </code><code>100</code><code>, baos);</code>

<code>    </code><code>if</code> <code>(baos.toByteArray().length / </code><code>1024</code> <code>&gt; </code><code>1024</code><code>)</code>

<code>    </code><code>{</code><code>// 判斷如果圖檔大于1M,進行壓縮避免在生成圖檔(BitmapFactory.decodeStream)時溢出</code>

<code>        </code><code>image.compress(Bitmap.CompressFormat.JPEG, </code><code>50</code><code>, baos);</code><code>// 這裡壓縮50%,把壓縮後的資料存放到baos中</code>

<code>    </code><code>ByteArrayInputStream isBm = </code><code>new</code> <code>ByteArrayInputStream(baos.toByteArray());</code>

<code>    </code><code>Bitmap bitmap = BitmapFactory.decodeStream(isBm, </code><code>null</code><code>, newOpts);</code>

<code>    </code><code>isBm = </code><code>new</code> <code>ByteArrayInputStream(baos.toByteArray());</code>

<code>    </code><code>bitmap = BitmapFactory.decodeStream(isBm, </code><code>null</code><code>, newOpts);</code>

5.圖檔轉為檔案

<code>// 圖檔轉為檔案</code>

<code>public</code> <code>static</code> <code>boolean</code> <code>saveBitmap2file(Bitmap bmp, String filename)</code>

<code>    </code><code>CompressFormat format = Bitmap.CompressFormat.JPEG;</code>

<code>    </code><code>int</code> <code>quality = </code><code>100</code><code>;</code>

<code>    </code><code>OutputStream stream = </code><code>null</code><code>;</code>

<code>    </code><code>try</code>

<code>    </code><code>{</code>

<code>        </code><code>stream = </code><code>new</code> <code>FileOutputStream(</code><code>"/sdcard/"</code> <code>+ filename);</code>

<code>    </code><code>catch</code> <code>(FileNotFoundException e)</code>

<code>        </code><code>e.printStackTrace();</code>

<code>                                                                                                                                                                                                                                                                                                                                                                     </code> 

<code>    </code><code>return</code> <code>bmp.compress(format, quality, stream);</code>

6.螢幕截屏方法

<code>// 螢幕截屏方法 擷取目前螢幕bitmap,轉換成bytes[] 調用 UI分享方法</code>

<code>public</code> <code>void</code> <code>printscreen_share(View v)</code>

<code>    </code><code>View view1 = getWindow().getDecorView();</code>

<code>    </code><code>Display display = getWindowManager().getDefaultDisplay();</code>

<code>    </code><code>view1.layout(</code><code>0</code><code>, </code><code>0</code><code>, display.getWidth(), display.getHeight());</code>

<code>    </code><code>view1.setDrawingCacheEnabled(</code><code>true</code><code>);</code>

<code>    </code><code>Bitmap bitmap = Bitmap.createBitmap(view1.getDrawingCache());</code>

7.把Bitmap 轉成 Byte

<code>// 把Bitmap 轉成 Byte</code>

<code>public</code> <code>static</code> <code>byte</code><code>[] Bitmap2Bytes(Bitmap bm)</code>

<code>    </code><code>bm.compress(Bitmap.CompressFormat.PNG, </code><code>100</code><code>, baos);</code>

<code>    </code><code>return</code> <code>baos.toByteArray();</code>

8.圖檔轉為檔案

<code>public</code> <code>static</code> <code>boolean</code> <code>saveBitmap2file(Bitmap bmp)</code>

<code>    </code><code>CompressFormat format = Bitmap.CompressFormat.PNG;</code>

<code>        </code><code>// 判斷SDcard狀态</code>

<code>        </code><code>if</code> <code>(!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()))</code>

<code>        </code><code>{</code>

<code>            </code><code>// 錯誤提示</code>

<code>            </code><code>return</code> <code>false</code><code>;</code>

<code>        </code><code>}</code>

<code>                                                                                                                                                                                                                                                                                                       </code> 

<code>        </code><code>// 檢查SDcard空間</code>

<code>        </code><code>File SDCardRoot = Environment.getExternalStorageDirectory();</code>

<code>        </code><code>if</code> <code>(SDCardRoot.getFreeSpace() &lt; </code><code>10000</code><code>)</code>

<code>            </code><code>// 彈出對話框提示使用者空間不夠</code>

<code>            </code><code>Log.e(</code><code>"Utils"</code><code>, </code><code>"存儲空間不夠"</code><code>);</code>

<code>        </code><code>// 在SDcard建立檔案夾及檔案</code>

<code>        </code><code>File bitmapFile = </code><code>new</code> <code>File(SDCardRoot.getPath() + FILE_PATH);</code>

<code>        </code><code>bitmapFile.getParentFile().mkdirs();</code><code>// 建立檔案夾</code>

<code>        </code><code>stream = </code><code>new</code> <code>FileOutputStream(SDCardRoot.getPath() + FILE_PATH);</code><code>// "/sdcard/"</code>

9.下載下傳圖檔

<code>// 下載下傳圖檔</code>

<code>public</code> <code>static</code> <code>Bitmap loadImage(String... params)</code>

<code>    </code><code>InputStream is = </code><code>null</code><code>;</code>

<code>    </code><code>Bitmap bitmap = </code><code>null</code><code>;</code>

<code>        </code><code>URL url = </code><code>new</code> <code>URL(params[</code><code>0</code><code>]);</code>

<code>        </code><code>HttpURLConnection conn = (HttpURLConnection) url.openConnection();</code>

<code>        </code><code>conn.setReadTimeout(</code><code>5000</code><code>);</code>

<code>        </code><code>conn.setConnectTimeout(</code><code>5000</code><code>);</code>

<code>        </code><code>if</code> <code>(HttpURLConnection.HTTP_OK != conn.getResponseCode())</code>

<code>            </code><code>// 網絡連接配接異常</code>

<code>            </code><code>Log.e(</code><code>""</code><code>, </code><code>"loadImage連接配接異常"</code><code>);</code>

<code>            </code><code>return</code> <code>null</code><code>;</code>

<code>                                                                                                                                                                                                                                                                          </code> 

<code>        </code><code>is = conn.getInputStream();</code>

<code>        </code><code>bitmap = BitmapFactory.decodeStream(is);</code>

<code>    </code><code>catch</code> <code>(MalformedURLException e)</code>

<code>    </code><code>catch</code> <code>(IOException e)</code>

<code>    </code><code>finally</code>

<code>        </code><code>if</code> <code>(</code><code>null</code> <code>!= is)</code>

<code>            </code><code>try</code>

<code>            </code><code>{</code>

<code>                </code><code>is.close();</code>

<code>            </code><code>}</code>

<code>            </code><code>catch</code> <code>(IOException e)</code>

<code>                </code><code>e.printStackTrace();</code>

10.byte[]轉換成Bitmap

<code>// byte[]轉換成Bitmap</code>

<code>public</code> <code>static</code> <code>Bitmap Bytes2Bitmap(</code><code>byte</code><code>[] b)</code>

<code>    </code><code>if</code> <code>(b.length != </code><code>0</code><code>)</code>

<code>        </code><code>return</code> <code>BitmapFactory.decodeByteArray(b, </code><code>0</code><code>, b.length);</code>

<code>    </code><code>return</code> <code>null</code><code>;</code>

11.将字元串轉換成Bitmap類型

<code>public</code> <code>static</code> <code>Bitmap stringtoBitmap(String string)</code>

<code>    </code><code>// 将字元串轉換成Bitmap類型</code>

<code>        </code><code>byte</code><code>[] bitmapArray;</code>

<code>        </code><code>bitmapArray = Base64.decode(string, Base64.DEFAULT);</code>

<code>        </code><code>bitmap = BitmapFactory.decodeByteArray(bitmapArray, </code><code>0</code><code>, bitmapArray.length);</code>

<code>    </code><code>catch</code> <code>(Exception e)</code>

<code>                                                                                                                                                                                                                                            </code> 

12.将Bitmap轉換成字元串

<code>public</code> <code>static</code> <code>String bitmaptoString(Bitmap bitmap)</code>

<code>    </code><code>// 将Bitmap轉換成字元串</code>

<code>    </code><code>String string = </code><code>null</code><code>;</code>

<code>    </code><code>ByteArrayOutputStream bStream = </code><code>new</code> <code>ByteArrayOutputStream();</code>

<code>    </code><code>bitmap.compress(CompressFormat.PNG, </code><code>100</code><code>, bStream);</code>

<code>    </code><code>byte</code><code>[] bytes = bStream.toByteArray();</code>

<code>    </code><code>string = Base64.encodeToString(bytes, Base64.DEFAULT);</code>

<code>    </code><code>return</code> <code>string;</code>

13.byte[]轉為檔案

<code>//byte[]轉為檔案</code>

<code>public</code> <code>static</code> <code>File getFileFromBytes(</code><code>byte</code><code>[] b)</code>

<code>    </code><code>BufferedOutputStream stream = </code><code>null</code><code>;</code>

<code>    </code><code>File file = </code><code>null</code><code>;</code>

<code>                                                                                                                                                                                                                      </code> 

<code>        </code><code>FileOutputStream fstream = </code><code>new</code> <code>FileOutputStream(bitmapFile);</code>

<code>        </code><code>stream = </code><code>new</code> <code>BufferedOutputStream(fstream);</code>

<code>        </code><code>stream.write(b);</code>

<code>        </code><code>if</code> <code>(stream != </code><code>null</code><code>)</code>

<code>                </code><code>stream.close();</code>

<code>            </code><code>catch</code> <code>(IOException e1)</code>

<code>                </code><code>e1.printStackTrace();</code>

<code>    </code><code>return</code> <code>file;</code>

14.圖檔壓縮

<code>//圖檔縮放</code>

<code>public</code> <code>static</code> <code>Bitmap scaleDownBitmap(Bitmap photo, </code><code>int</code> <code>newHeight, Context context)</code>

<code>                                                                                                                                                                                                       </code> 

<code>    </code><code>final</code> <code>float</code> <code>densityMultiplier = context.getResources().getDisplayMetrics().density;</code>

<code>    </code><code>int</code> <code>h = (</code><code>int</code><code>) (newHeight * densityMultiplier);</code>

<code>    </code><code>int</code> <code>w = (</code><code>int</code><code>) (h * photo.getWidth() / ((</code><code>double</code><code>) photo.getHeight()));</code>

<code>    </code><code>photo = Bitmap.createScaledBitmap(photo, w, h, </code><code>true</code><code>);</code>

<code>    </code><code>return</code> <code>photo;</code>

15.将byte[]轉換成InputStream

<code>// 将byte[]轉換成InputStream</code>

<code>public</code> <code>InputStream Byte2InputStream(</code><code>byte</code><code>[] b)</code>

<code>    </code><code>ByteArrayInputStream bais = </code><code>new</code> <code>ByteArrayInputStream(b);</code>

<code>    </code><code>return</code> <code>bais;</code>

16.将InputStream轉換成byte[]

<code>// 将InputStream轉換成byte[]</code>

<code>public</code> <code>byte</code><code>[] InputStream2Bytes(InputStream is)</code>

<code>    </code><code>String str = </code><code>""</code><code>;</code>

<code>    </code><code>byte</code><code>[] readByte = </code><code>new</code> <code>byte</code><code>[</code><code>1024</code><code>];</code>

<code>    </code><code>int</code> <code>readCount = -</code><code>1</code><code>;</code>

<code>        </code><code>while</code> <code>((readCount = is.read(readByte, </code><code>0</code><code>, </code><code>1024</code><code>)) != -</code><code>1</code><code>)</code>

<code>            </code><code>str += </code><code>new</code> <code>String(readByte).trim();</code>

<code>        </code><code>return</code> <code>str.getBytes();</code>

17.将Bitmap轉換成InputStream

<code>// 将Bitmap轉換成InputStream</code>

<code>public</code> <code>InputStream Bitmap2InputStream(Bitmap bm)</code>

<code>    </code><code>bm.compress(Bitmap.CompressFormat.JPEG, </code><code>100</code><code>, baos);</code>

<code>    </code><code>InputStream is = </code><code>new</code> <code>ByteArrayInputStream(baos.toByteArray());</code>

<code>    </code><code>return</code> <code>is;</code>

18.将Bitmap轉換成InputStream

<code>public</code> <code>InputStream Bitmap2InputStream(Bitmap bm, </code><code>int</code> <code>quality)</code>

<code>    </code><code>bm.compress(Bitmap.CompressFormat.PNG, quality, baos);</code>

19.将InputStream轉換成Bitmap

<code>// 将InputStream轉換成Bitmap</code>

<code>public</code> <code>Bitmap InputStream2Bitmap(InputStream is)</code>

<code>    </code><code>return</code> <code>BitmapFactory.decodeStream(is);</code>

20.Drawable轉換成InputStream

<code>// Drawable轉換成InputStream</code>

<code>public</code> <code>InputStream Drawable2InputStream(Drawable d)</code>

<code>    </code><code>Bitmap bitmap = </code><code>this</code><code>.drawable2Bitmap(d);</code>

<code>    </code><code>return</code> <code>this</code><code>.Bitmap2InputStream(bitmap);</code>

21.InputStream轉換成Drawable

<code>// InputStream轉換成Drawable</code>

<code>public</code> <code>Drawable InputStream2Drawable(InputStream is)</code>

<code>    </code><code>Bitmap bitmap = </code><code>this</code><code>.InputStream2Bitmap(is);</code>

<code>    </code><code>return</code> <code>this</code><code>.bitmap2Drawable(bitmap);</code>

22.Drawable轉換成byte[]

<code>// Drawable轉換成byte[]</code>

<code>public</code> <code>byte</code><code>[] Drawable2Bytes(Drawable d)</code>

<code>    </code><code>return</code> <code>this</code><code>.Bitmap2Bytes(bitmap);</code>

23.byte[]轉換成Drawable

<code>// byte[]轉換成Drawable</code>

<code>public</code> <code>Drawable Bytes2Drawable(</code><code>byte</code><code>[] b)</code>

<code>    </code><code>Bitmap bitmap = </code><code>this</code><code>.Bytes2Bitmap(b);</code>

24.Drawable轉換成Bitmap

<code>// Drawable轉換成Bitmap</code>

<code>public</code> <code>Bitmap drawable2Bitmap(Drawable drawable)</code>

<code>    </code><code>Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(),</code>

<code>            </code><code>drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);</code>

<code>    </code><code>Canvas canvas = </code><code>new</code> <code>Canvas(bitmap);</code>

<code>    </code><code>drawable.setBounds(</code><code>0</code><code>, </code><code>0</code><code>, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());</code>

<code>    </code><code>drawable.draw(canvas);</code>

25.Bitmap轉換成Drawable

<code>// Bitmap轉換成Drawable</code>

<code>public</code> <code>Drawable bitmap2Drawable(Bitmap bitmap)</code>

<code>    </code><code>BitmapDrawable bd = </code><code>new</code> <code>BitmapDrawable(bitmap);</code>

<code>    </code><code>Drawable d = (Drawable) bd;</code>

<code>    </code><code>return</code> <code>d;</code>

本文轉自 glblong 51CTO部落格,原文連結:http://blog.51cto.com/glblong/1304090,如需轉載請自行聯系原作者

繼續閱讀