现在的位置: 首页 > 综合 > 正文

android 图片处理

2013年07月23日 ⁄ 综合 ⁄ 共 7865字 ⁄ 字号 评论关闭

多张图片四个方位的图片合成,改变bitmap大小,图片去色等功能 


 

 

Java代码  收藏代码
  1. package com.dzh.operateimage;  
  2. import android.graphics.Bitmap;  
  3. import android.graphics.Bitmap.Config;  
  4. import android.graphics.BitmapFactory;  
  5. import android.graphics.Canvas;  
  6. import android.graphics.ColorMatrix;  
  7. import android.graphics.ColorMatrixColorFilter;  
  8. import android.graphics.Paint;  
  9. import android.graphics.PorterDuff.Mode;  
  10. import android.graphics.PorterDuffXfermode;  
  11. import android.graphics.Rect;  
  12. import android.graphics.RectF;  
  13. import android.graphics.drawable.BitmapDrawable;  
  14. import android.graphics.drawable.Drawable;  
  15. import java.io.ByteArrayOutputStream;  
  16. import java.io.File;  
  17. import java.io.FileNotFoundException;  
  18. import java.io.FileOutputStream;  
  19. import java.io.IOException;  
  20. /** 
  21. * 处理图片的工具类. 
  22. */  
  23. public class ImageTools {  
  24. public static final int LEFT = 0;  
  25. public static final int RIGHT = 1;  
  26. public static final int TOP = 3;  
  27. public static final int BOTTOM = 4;  
  28. /** */  
  29. /** 
  30. * 图片去色,返回灰度图片 
  31.  
  32. * @param bmpOriginal 传入的图片 
  33. * @return 去色后的图片 
  34. */  
  35. public static Bitmap toGrayscale(Bitmap bmpOriginal) {  
  36. int width, height;  
  37. height = bmpOriginal.getHeight();  
  38. width = bmpOriginal.getWidth();  
  39. Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);  
  40. Canvas c = new Canvas(bmpGrayscale);  
  41. Paint paint = new Paint();  
  42. ColorMatrix cm = new ColorMatrix();  
  43. cm.setSaturation(0);  
  44. ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);  
  45. paint.setColorFilter(f);  
  46. c.drawBitmap(bmpOriginal, 00, paint);  
  47. return bmpGrayscale;  
  48. }  
  49. /** */  
  50. /** 
  51. * 去色同时加圆角 
  52.  
  53. * @param bmpOriginal 原图 
  54. * @param pixels 圆角弧度 
  55. * @return 修改后的图片 
  56. */  
  57. public static Bitmap toGrayscale(Bitmap bmpOriginal, int pixels) {  
  58. return toRoundCorner(toGrayscale(bmpOriginal), pixels);  
  59. }  
  60. /** */  
  61. /** 
  62. * 把图片变成圆角 
  63.  
  64. * @param bitmap 需要修改的图片 
  65. * @param pixels 圆角的弧度 
  66. * @return 圆角图片 
  67. */  
  68. public static Bitmap toRoundCorner(Bitmap bitmap, int pixels) {  
  69. Bitmap output = Bitmap  
  70. .createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);  
  71. Canvas canvas = new Canvas(output);  
  72. final int color = 0xff424242;  
  73. final Paint paint = new Paint();  
  74. final Rect rect = new Rect(00, bitmap.getWidth(), bitmap.getHeight());  
  75. final RectF rectF = new RectF(rect);  
  76. final float roundPx = pixels;  
  77. paint.setAntiAlias(true);  
  78. canvas.drawARGB(0000);  
  79. paint.setColor(color);  
  80. canvas.drawRoundRect(rectF, roundPx, roundPx, paint);  
  81. paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));  
  82. canvas.drawBitmap(bitmap, rect, rect, paint);  
  83. return output;  
  84. }  
  85. /** */  
  86. /** 
  87. * 使圆角功能支持BitampDrawable 
  88.  
  89. * @param bitmapDrawable 
  90. * @param pixels 
  91. * @return 
  92. */  
  93. public static BitmapDrawable toRoundCorner(BitmapDrawable bitmapDrawable, int pixels) {  
  94. Bitmap bitmap = bitmapDrawable.getBitmap();  
  95. bitmapDrawable = new BitmapDrawable(toRoundCorner(bitmap, pixels));  
  96. return bitmapDrawable;  
  97. }  
  98. /** 
  99. * 读取路径中的图片,然后将其转化为缩放后的bitmap 
  100.  
  101. * @param path 
  102. */  
  103. public static void saveBefore(String path) {  
  104. BitmapFactory.Options options = new BitmapFactory.Options();  
  105. options.inJustDecodeBounds = true;  
  106. // 获取这个图片的宽和高  
  107. Bitmap bitmap = BitmapFactory.decodeFile(path, options); // 此时返回bm为空  
  108. options.inJustDecodeBounds = false;  
  109. // 计算缩放比  
  110. int be = (int)(options.outHeight / (float)200);  
  111. if (be <= 0)  
  112. be = 1;  
  113. options.inSampleSize = 2// 图片长宽各缩小二分之一  
  114. // 重新读入图片,注意这次要把options.inJustDecodeBounds 设为 false哦  
  115. bitmap = BitmapFactory.decodeFile(path, options);  
  116. int w = bitmap.getWidth();  
  117. int h = bitmap.getHeight();  
  118. System.out.println(w + " " + h);  
  119. // savePNG_After(bitmap,path);  
  120. saveJPGE_After(bitmap, path);  
  121. }  
  122. /** 
  123. * 保存图片为PNG 
  124.  
  125. * @param bitmap 
  126. * @param name 
  127. */  
  128. public static void savePNG_After(Bitmap bitmap, String name) {  
  129. File file = new File(name);  
  130. try {  
  131. FileOutputStream out = new FileOutputStream(file);  
  132. if (bitmap.compress(Bitmap.CompressFormat.PNG, 100, out)) {  
  133. out.flush();  
  134. out.close();  
  135. }  
  136. catch (FileNotFoundException e) {  
  137. e.printStackTrace();  
  138. catch (IOException e) {  
  139. e.printStackTrace();  
  140. }  
  141. }  
  142. /** 
  143. * 保存图片为JPEG 
  144.  
  145. * @param bitmap 
  146. * @param path 
  147. */  
  148. public static void saveJPGE_After(Bitmap bitmap, String path) {  
  149. File file = new File(path);  
  150. try {  
  151. FileOutputStream out = new FileOutputStream(file);  
  152. if (bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out)) {  
  153. out.flush();  
  154. out.close();  
  155. }  
  156. catch (FileNotFoundException e) {  
  157. e.printStackTrace();  
  158. catch (IOException e) {  
  159. e.printStackTrace();  
  160. }  
  161. }  
  162. /** 
  163. * 水印 
  164.  
  165. * @param bitmap 
  166. * @return 
  167. */  
  168. public static Bitmap createBitmapForWatermark(Bitmap src, Bitmap watermark) {  
  169. if (src == null) {  
  170. return null;  
  171. }  
  172. int w = src.getWidth();  
  173. int h = src.getHeight();  
  174. int ww = watermark.getWidth();  
  175. int wh = watermark.getHeight();  
  176. // create the new blank bitmap  
  177. Bitmap newb = Bitmap.createBitmap(w, h, Config.ARGB_8888);// 创建一个新的和SRC长度宽度一样的位图  
  178. Canvas cv = new Canvas(newb);  
  179. // draw src into  
  180. cv.drawBitmap(src, 00null);// 在 0,0坐标开始画入src  
  181. // draw watermark into  
  182. cv.drawBitmap(watermark, w - ww + 5, h - wh + 5null);// 在src的右下角画入水印  
  183. // save all clip  
  184. cv.save(Canvas.ALL_SAVE_FLAG);// 保存  
  185. // store  
  186. cv.restore();// 存储  
  187. return newb;  
  188. }  
  189. /** 
  190. * 图片合成 
  191.  
  192. * @return 
  193. */  
  194. public static Bitmap potoMix(int direction, Bitmap... bitmaps) {  
  195. if (bitmaps.length <= 0) {  
  196. return null;  
  197. }  
  198. if (bitmaps.length == 1) {  
  199. return bitmaps[0];  
  200. }  
  201. Bitmap newBitmap = bitmaps[0];  
  202. // newBitmap = createBitmapForFotoMix(bitmaps[0],bitmaps[1],direction);  
  203. for (int i = 1; i < bitmaps.length; i++) {  
  204. newBitmap = createBitmapForFotoMix(newBitmap, bitmaps[i], direction);  
  205. }  
  206. return newBitmap;  
  207. }  
  208.   
  209. private static Bitmap createBitmapForFotoMix(Bitmap first, Bitmap second, int direction) {  
  210. if (first == null) {  
  211. return null;  
  212. }  
  213. if (second == null) {  
  214. return first;  
  215. }   
  216. int fw = first.getWidth();  
  217. int fh = first.getHeight();  
  218. int sw = second.getWidth();  
  219. int sh = second.getHeight();  
  220. Bitmap newBitmap = null;  
  221. if (direction == LEFT) {  
  222. newBitmap = Bitmap.createBitmap(fw + sw, fh > sh ? fh : sh, Config.ARGB_8888);  
  223. Canvas canvas = new Canvas(newBitmap);  
  224. canvas.drawBitmap(first, sw, 0null);  
  225. canvas.drawBitmap(second, 00null);  
  226. else if (direction == RIGHT) {  
  227. newBitmap = Bitmap.createBitmap(fw + sw, fh > sh ? fh : sh, Config.ARGB_8888);  
  228. Canvas canvas = new Canvas(newBitmap);  
  229. canvas.drawBitmap(first, 00null);  
  230. canvas.drawBitmap(second, fw, 0null);  
  231. else if (direction == TOP) {  
  232. newBitmap = Bitmap.createBitmap(sw > fw ? sw : fw, fh + sh, Config.ARGB_8888);  
  233. Canvas canvas = new Canvas(newBitmap);  
  234. canvas.drawBitmap(first, 0, sh, null);  
  235. canvas.drawBitmap(second, 00null);  
  236. else if (direction == BOTTOM) {  
  237. newBitmap = Bitmap.createBitmap(sw > fw ? sw : fw, fh + sh, Config.ARGB_8888);  
  238. Canvas canvas = new Canvas(newBitmap);  
  239. canvas.drawBitmap(first, 00null);  
  240. canvas.drawBitmap(second, 0, fh, null);  
  241. }  
  242. return newBitmap;  
  243. }  
  244. /** 
  245. * 将Bitmap转换成指定大小 
  246. * @param bitmap 
  247. * @param width 
  248. * @param height 
  249. * @return 
  250. */  
  251. public static Bitmap createBitmapBySize(Bitmap bitmap,int width,int height)  
  252. {  
  253. return Bitmap.createScaledBitmap(bitmap, width, height, true);  
  254. }  
  255. /** 
  256. * Drawable 转 Bitmap 
  257.  
  258. * @param drawable 
  259. * @return 
  260. */  
  261. public static Bitmap drawableToBitmapByBD(Drawable drawable) {  
  262. BitmapDrawable bitmapDrawable = (BitmapDrawable)drawable;  
  263. return bitmapDrawable.getBitmap();  
  264. }  
  265. /** 
  266. * Bitmap 转 Drawable 
  267.  
  268. * @param bitmap 
  269. * @return 
  270. */  
  271. public static Drawable bitmapToDrawableByBD(Bitmap bitmap) {  
  272. Drawable drawable = new BitmapDrawable(bitmap);  
  273. return drawable;  
  274. }  
  275. /** 
  276. * byte[] 转 bitmap 
  277.  
  278. * @param b 
  279. * @return 
  280. */  
  281. public static Bitmap bytesToBimap(byte[] b) {  
  282. if (b.length != 0) {  
  283. return BitmapFactory.decodeByteArray(b, 0, b.length);  
  284. else {  
  285. return null;  
  286. }  
  287. }  
  288. /** 
  289. * bitmap 转 byte[] 
  290.  
  291. * @param bm 
  292. * @return 
  293. */  
  294. public static byte[] bitmapToBytes(Bitmap bm) {  
  295. ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  296. bm.compress(Bitmap.CompressFormat.PNG, 100, baos);  
  297. return baos.toByteArray();  
  298. }  

转自:http://zhanhao.iteye.com/blog/1276449,有代码附件下载

抱歉!评论已关闭.