Android中对图片处理应用比较常见,所以整理了一些对图片的基本操作处理功能方法:
1. /**
2. * 图片反转
3. * @param img
4. * @return
5. */
6. public
7. new
8. 90); /*翻转90度*/
9. int
10. int
11. 0, 0, width, height, matrix, true);
12. return
13. }
14. /**
15. * 图片缩放
16. * @param bigimage
17. * @param newWidth
18. * @param newHeight
19. * @return
20. */
21. public Bitmap tochange(Bitmap bigimage,int newWidth,int
22. // 获取这个图片的宽和高
23. int
24. int
25. // 创建操作图片用的matrix对象
26. new
27. // 计算缩放率,新尺寸除原始尺寸
28. float scaleWidth = ((float) newWidth)/width;
29. float scaleHeight = ((float) newHeight)/height;
30. // 缩放图片动作
31. matrix.postScale(scaleWidth, scaleHeight);
32. 0, 0, width, height,matrix, true);
33. return
34. }
1. /**
2. * 程序切割图片
3. * @param bitmap
4. * @param x
5. * @param y
6. * @param w
7. * @param h
8. * @return
9. */
10. public Bitmap BitmapClipBitmap(Bitmap bitmap,int x, int y, int w, int
11. return
12. }
1. /**
2. * 图片叠加
3. * @param b
4. * @return
5. */
6. public
7.
8. if(!b.isMutable()){
9. //设置图片为背景为透明
10. true);//
11. }
12. new
13. Bitmap lock=BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
14. //叠加新图b2
15. //注意此时绘制坐标是相对于图片b
16. 0, 0, null);
17. canvas.save(Canvas.ALL_SAVE_FLAG);
18. canvas.restore();
19. lock.recycle();
20. null;
21. return
22. }
图片居中叠加:
1. Bitmap centerToFit(Bitmap bitmap, int width, int
2. final int
3. final int
4.
5. if
6. int
7.
8. Bitmap centered = Bitmap.createBitmap(bitmapWidth < width ? width : bitmapWidth,
9. bitmapHeight < height ? height : bitmapHeight, Bitmap.Config.RGB_565);
10. centered.setDensity(bitmap.getDensity());
11. new
12. canvas.drawColor(color);
13. 2.0f, (height - bitmapHeight) / 2.0f,
14. null);
15.
16. bitmap = centered;
17. }
18.
19. return
20. }
对图像进行相关参数转换,重新形成新的图片数据参数展示形式(Drawble)
1. /**
2. * Create a drawable from file path name.
3. */
4. public
5. if (pathName == null) {
6. return null;
7. }
8.
9. new
10. true;
11.
12. true;
13. BitmapFactory.decodeFile(pathName, opts);
14.
15. 1, 1280 * 720);
16. false;
17.
18. Bitmap bm = BitmapFactory.decodeFile(pathName, opts);
19.
20. if (bm != null) {
21. return drawableFromBitmap(null, bm, null, null, pathName);
22. }
23.
24. return null;
25. }
26.
27. private Drawable drawableFromBitmap(Resources res, Bitmap bm, byte[] np,
28. Rect pad, String srcName) {
29.
30. if (np != null) {
31. return new
32. }
33.
34. return new
35. }
36.
37. public int
38. int minSideLength, int
39. int
40. maxNumOfPixels);
41.
42. int
43. if (initialSize <= 8) {
44. 1;
45. while
46. 1;
47. }
48. else
49. 7) / 8 * 8;
50. }
51.
52. return
53. }
54.
55. private int
56. int minSideLength, int
57. double
58. double
59.
60. int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math
61. .sqrt(w * h / maxNumOfPixels));
62. int upperBound = (minSideLength == -1) ? 128 : (int) Math.min(
63. Math.floor(w / minSideLength), Math.floor(h / minSideLength));
64.
65. if
66. // return the larger one when there is no overlapping zone.
67. return
68. }
69.
70. if ((maxNumOfPixels == -1) && (minSideLength == -1)) {
71. return 1;
72. else if (minSideLength == -1) {
73. return
74. else
75. return
76. }
77. }
1. /**
2. * create the bitmap from a byte array
3. *生成水印图片
4. * @param src the bitmap object you want proecss
5. * @param watermark the water mark above the src
6. * @return return a bitmap object ,if paramter's length is 0,return null
7. */
8. private
9. {
10. "createBitmap";
11. "create a new bitmap"
12. if( src == null
13. {
14. return null;
15. }
16.
17. int
18. int
19. int
20. int
21. //create the new blank bitmap
22. //创建一个新的和SRC长度宽度一样的位图
23. new
24. //draw src into
25. 0, 0, null );//在 0,0坐标开始画入src
26. //draw watermark into
27. 5, h - wh + 5, null );//在src的右下角画入水印
28. //save all clip
29. //保存
30. //store
31. //存储
32. return
33. }
更多处理
1. /**圆角处理
2. * 实际上是在原图片上画了一个圆角遮罩。对于paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
3. * 方法我刚看到也是一知半解Mode.SRC_IN参数是个画图模式,该类型是指只显 示两层图案的交集部分,且交集部位只显示上层图像。
4. * 实际就是先画了一个圆角矩形的过滤框,于是形状有了,再将框中的内容填充为图片
5. * @param bitmap
6. * @param roundPx
7. * @return
8. */
9. public static Bitmap getRoundedCornerBitmap(Bitmap bitmap,float
10. {
11.
12. Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
13. bitmap.getHeight(), Config.ARGB_8888);
14. new
15.
16. final int color =0xff424242;
17. final Paint paint =new
18. final Rect rect =new Rect(0,0, bitmap.getWidth(), bitmap.getHeight());
19. final RectF rectF =new
20.
21. true);
22. 0,0,0,0);
23. paint.setColor(color);
24. canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
25.
26. new
27. canvas.drawBitmap(bitmap, rect, rect, paint);
28.
29. return
30. }
31. /**
32. * 灰白处理
33. 就是利用了ColorMatrix 类自带的设置饱和度的方法setSaturation()。
34. 不过其方法内部实现的更深一层是利用颜色矩阵的乘法实现的,对于颜色矩阵的乘法下面还有使用
35. * @param bmpOriginal
36. * @return
37. */
38. public static
39. {
40. int
41. height = bmpOriginal.getHeight();
42. width = bmpOriginal.getWidth();
43.
44. Bitmap bmpGrayscale = Bitmap.createBitmap(width, height,
45. Bitmap.Config.RGB_565);
46. new
47. new
48. new
49. 0);
50. new
51. paint.setColorFilter(f);
52. 0,0, paint);
53. return
54. }
55.
56. /**
57. * 黑白处理
58. 这张图片不同于灰白处理的那张,不同之处是灰白处理虽然没有了颜色,
59. 但是黑白的程度层次依然存在,而此张图片连层次都没有了,只有两个区别十分明显的黑白 颜色。
60. 实现的算法也很简单,对于每个像素的rgb值求平均数,如果高于100算白色,低于100算黑色。
61. 不过感觉100这个标准值太大了,导致图片白色区 域太多,把它降低点可能效果会更好
62. * @param mBitmap
63. * @return
64. */
65. public static
66. {
67. int mBitmapWidth =0;
68. int mBitmapHeight =0;
69.
70. mBitmapWidth = mBitmap.getWidth();
71. mBitmapHeight = mBitmap.getHeight();
72. Bitmap bmpReturn = Bitmap.createBitmap(mBitmapWidth, mBitmapHeight,
73. Bitmap.Config.ARGB_8888);
74. int iPixel =0;
75. for(int i =0; i < mBitmapWidth; i++)
76. {
77. for(int j =0; j < mBitmapHeight; j++)
78. {
79. int
80.
81. int
82. 3;
83. if(avg >=100)
84. {
85. 255;
86. }
87. else
88. {
89. 0;
90. }
91. int modif_color = Color.argb(255, iPixel, iPixel, iPixel);
92.
93. bmpReturn.setPixel(i, j, modif_color);
94. }
95. }
96. return
97. }
98. /**
99. * 镜像处理
100. * 原理就是将原图片反转一下,调整一 下它的颜色作出倒影效果,再将两张图片续加在一起,
101. * 不过如果在反转的同时再利用Matrix加上一些倾斜角度就更好了,不过那样做的话加工后的图片的高度需要同比例计算出来,
102. * 不能简单的相加了,否则就图片大小就容不下现有的像素内容。
103. * @param bitmap
104. * @return
105. */
106. public static
107. {
108. final int reflectionGap =4;
109. int
110. int
111.
112. new
113. 1, -1);
114.
115. 0, height /2,
116. 2, matrix,false);
117.
118. Bitmap bitmapWithReflection = Bitmap.createBitmap(width,
119. 2), Config.ARGB_8888);
120.
121. new
122. 0,0,null);
123. new
124. 0, height, width, height + reflectionGap, deafalutPaint);
125.
126. 0, height + reflectionGap,null);
127.
128. new
129. new LinearGradient(0, bitmap.getHeight(),0,
130. 0x70ffffff,
131. 0x00ffffff, TileMode.CLAMP);
132. paint.setShader(shader);
133. // Set the Transfer mode to be porter duff and destination in
134. new
135. // Draw a rectangle using the paint with our linear gradient
136. 0, height, width, bitmapWithReflection.getHeight()
137. + reflectionGap, paint);
138.
139. return
140. }
141. /**
142. * 加旧处理
143. * @param bitmap
144. * @return
145. */
146. public static
147. {
148. Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
149. bitmap.getHeight(), Config.RGB_565);
150.
151. new
152.
153. new
154. new
155. float[] array = {1,0,0,0,50,
156. 0,1,0,0,50,
157. 0,0,1,0,0,
158. 0,0,0,1,0};
159. cm.set(array);
160. new
161.
162. 0,0, paint);
163. return
164. }
165. /**
166. * 浮雕处理
167. * 观察浮雕就不难发现,其实浮雕的特点就是在颜色有跳变的地方就刻条痕迹。127,127,127为深灰色,
168. * 近似于石头的颜色,此处取该颜色为底色。算法是将上一个点的rgba值减去当前点的rgba值然后加上127得到当前点的颜色。
169. * @param mBitmap
170. * @return
171. */
172. public static
173. {
174.
175.
176. int mBitmapWidth =0;
177. int mBitmapHeight =0;
178.
179. mBitmapWidth = mBitmap.getWidth();
180. mBitmapHeight = mBitmap.getHeight();
181. Bitmap bmpReturn = Bitmap.createBitmap(mBitmapWidth, mBitmapHeight,
182. Bitmap.Config.RGB_565);
183. int preColor =0;
184. int prepreColor =0;
185. 0,0);
186.
187. for(int i =0; i < mBitmapWidth; i++)
188. {
189. for(int j =0; j < mBitmapHeight; j++)
190. {
191. int
192. int r = Color.red(curr_color) - Color.red(prepreColor) +127;
193. int g = Color.green(curr_color) - Color.red(prepreColor) +127;
194. int b = Color.green(curr_color) - Color.blue(prepreColor) +127;
195. int
196. int
197. bmpReturn.setPixel(i, j, modif_color);
198. prepreColor = preColor;
199. preColor = curr_color;
200. }
201. }
202.
203. new
204. new
205. new
206. 0);
207. new
208. paint.setColorFilter(f);
209. 0,0, paint);
210.
211. return
212. }
213. /**
214. * 油画处理
215. * 其实油画因为是用画笔画的,彩笔画的时候没有那么精确会将本该这点的颜色滑到另一个点处。
216. * 算法实现就是取一个一定范围内的随机数,每个点的颜色是该点减去随机数坐标后所得坐标的颜色。
217. * @param bmpSource
218. * @return
219. */
220. public static
221. {
222. Bitmap bmpReturn = Bitmap.createBitmap(bmpSource.getWidth(),
223. bmpSource.getHeight(), Bitmap.Config.RGB_565);
224. int color =0;
225. int Radio =0;
226. int
227. int
228.
229. new
230. int iModel =10;
231. int
232. while(i >1)
233. {
234. int
235. while(j >1)
236. {
237. int iPos = rnd.nextInt(100000) % iModel;
238. color = bmpSource.getPixel(i + iPos, j + iPos);
239. bmpReturn.setPixel(i, j, color);
240. 1;
241. }
242. 1;
243. }
244. return
245. }
246.
247. /**
248. * 模糊处理
249. * 算法实现其实是取每三点的平均值做为当前点颜色,这样看上去就变得模糊了。
250. * 这个算法是三点的平均值,如果能够将范围扩大,并且不是单纯的平均值,
251. * 而是加权 平均肯定效果会更好。不过处理速度实在是太慢了,而Muzei这种软件在处理的时候
252. * ,不仅仅速度特别快,而且还有逐渐变模糊的变化过程,显然人家不是用这 种算法实现的。
253. * 他们的实现方法正在猜测中,实现后也来更新。
254. * @param bmpSource
255. * @param Blur
256. * @return
257. */
258. public static Bitmap blurBitmap(Bitmap bmpSource,int
259. {
260. int mode =5;
261. Bitmap bmpReturn = Bitmap.createBitmap(bmpSource.getWidth(),
262. bmpSource.getHeight(), Bitmap.Config.ARGB_8888);
263. int pixels[] =new int[bmpSource.getWidth() * bmpSource.getHeight()];
264. int pixelsRawSource[] =new int[bmpSource.getWidth()
265. 3];
266. int pixelsRawNew[] =new int[bmpSource.getWidth()
267. 3];
268.
269. 0, bmpSource.getWidth(),0,0,
270. bmpSource.getWidth(), bmpSource.getHeight());
271.
272. for(int k =1; k <= Blur; k++)
273. {
274.
275. for(int i =0; i < pixels.length; i++)
276. {
277. 3+0] = Color.red(pixels[i]);
278. 3+1] = Color.green(pixels[i]);
279. 3+2] = Color.blue(pixels[i]);
280. }
281.
282. int CurrentPixel = bmpSource.getWidth() *3+3;
283.
284. for(int i =0; i < bmpSource.getHeight() -3; i++)
285. {
286. for(int j =0; j < bmpSource.getWidth() *3; j++)
287. {
288. 1;
289. int sumColor =0;
290. sumColor = pixelsRawSource[CurrentPixel
291. 3];
292. 3];
293. 3];
294. sumColor = sumColor
295. + pixelsRawSource[CurrentPixel
296. 3];
297. 4);
298. }
299. }
300.
301. for(int i =0; i < pixels.length; i++)
302. {
303. 3+0],
304. 3+1], pixelsRawNew[i *3+2]);
305. }
306. }
307.
308. 0, bmpSource.getWidth(),0,0,
309. bmpSource.getWidth(), bmpSource.getHeight());
310. return
311. }
312. /**
313. * 图片合并
314. * @param bitmap1
315. * @param bitmap2
316. * @param path
317. * @return
318. * @throws FileNotFoundException
319. */
320. public static Bitmap toJoinbitmap(Bitmap bitmap1,Bitmap bitmap2,String path) throws
321.
322. Bitmap bitmap3 = Bitmap.createBitmap(bitmap1.getWidth(), bitmap1.getHeight(), bitmap1.getConfig());
323. new
324. new Matrix(),null);
325. 120,350,null); //120、350为bitmap2写入点的x、y坐标
326. //将合并后的bitmap3保存为png图片到本地
327. new FileOutputStream(path+"/image3.png");
328. 90, out);
329. return
330. }
331.
332. /**文字保存为png图片
333. * @param path 文件保存路径
334. * @param data 保存数据
335. * @throws FileNotFoundException
336. * */
337. public static void textToImage(String path,ArrayList<String> data) throws
338.
339. int height = data.size()*20; //图片高
340. 270,height, Config.ARGB_8888);
341. new
342. //背景颜色
343.
344. new
345. //画笔颜色
346. 15); //画笔粗细
347. for(int i=0;i<data.size();i++){
348. 20,(i+1)*20,p);
349. }
350. new
351. 90, out);
352. }
353.