天天看点

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,如需转载请自行联系原作者

继续阅读