Android中图片的处理(放大缩小,去色,转换格式,增加水印等)
转载网站:http://www.linuxidc.com/Linux/2011-11/48110.htm###
1packagecom.dzh.operateimage;
2importandroid.graphics.Bitmap;
3importandroid.graphics.Bitmap.Config;
4importandroid.graphics.BitmapFactory;
5importandroid.graphics.Canvas;
6importandroid.graphics.ColorMatrix;
7importandroid.graphics.ColorMatrixColorFilter;
8importandroid.graphics.Paint;
9importandroid.graphics.PorterDuff.Mode;
10importandroid.graphics.PorterDuffXfermode;
11importandroid.graphics.Rect;
12importandroid.graphics.RectF;
13importandroid.graphics.drawable.BitmapDrawable;
14importandroid.graphics.drawable.Drawable;
15importjava.io.ByteArrayOutputStream;
16importjava.io.File;
17importjava.io.FileNotFoundException;
18importjava.io.FileOutputStream;
19importjava.io.IOException;
20/**
21*处理图片的工具类.
22*/
23publicclassImageTools{
24publicstaticfinalintLEFT=0;
25publicstaticfinalintRIGHT=1;
26publicstaticfinalintTOP=3;
27publicstaticfinalintBOTTOM=4;
28/***/
29/**
30*图片去色,返回灰度图片
31*
32*@parambmpOriginal传入的图片
33*@return去色后的图片
34*/
35publicstaticBitmaptoGrayscale(BitmapbmpOriginal){
36intwidth,height;
37height=bmpOriginal.getHeight();
38width=bmpOriginal.getWidth();
39BitmapbmpGrayscale=Bitmap.createBitmap(width,height,Bitmap.Config.RGB_565);
40Canvasc=newCanvas(bmpGrayscale);
41Paintpaint=newPaint();
42ColorMatrixcm=newColorMatrix();
43cm.setSaturation(0);
44ColorMatrixColorFilterf=newColorMatrixColorFilter(cm);
45paint.setColorFilter(f);
46c.drawBitmap(bmpOriginal,0,0,paint);
47returnbmpGrayscale;
48}
49/***/
50/**
51*去色同时加圆角
52*
53*@parambmpOriginal原图
54*@parampixels圆角弧度
55*@return修改后的图片
56*/
57publicstaticBitmaptoGrayscale(BitmapbmpOriginal,intpixels){
58returntoRoundCorner(toGrayscale(bmpOriginal),pixels);
59}
60/***/
61/**
62*把图片变成圆角
63*
64*@parambitmap需要修改的图片
65*@parampixels圆角的弧度
66*@return圆角图片
67*/
68publicstaticBitmaptoRoundCorner(Bitmapbitmap,intpixels){
69Bitmapoutput=Bitmap
70.createBitmap(bitmap.getWidth(),bitmap.getHeight(),Config.ARGB_8888);
71Canvascanvas=newCanvas(output);
72finalintcolor=0xff424242;
73finalPaintpaint=newPaint();
74finalRectrect=newRect(0,0,bitmap.getWidth(),bitmap.getHeight());
75finalRectFrectF=newRectF(rect);
76finalfloatroundPx=pixels;
77paint.setAntiAlias(true);
78canvas.drawARGB(0,0,0,0);
79paint.setColor(color);
80canvas.drawRoundRect(rectF,roundPx,roundPx,paint);
81paint.setXfermode(newPorterDuffXfermode(Mode.SRC_IN));
82canvas.drawBitmap(bitmap,rect,rect,paint);
83returnoutput;
84}
85/***/
86/**
87*使圆角功能支持BitampDrawable
88*
89*@parambitmapDrawable
90*@parampixels
91*@return
92*/
93publicstaticBitmapDrawabletoRoundCorner(BitmapDrawablebitmapDrawable,intpixels){
94Bitmapbitmap=bitmapDrawable.getBitmap();
95bitmapDrawable=newBitmapDrawable(toRoundCorner(bitmap,pixels));
96returnbitmapDrawable;
97}
98/**
99*读取路径中的图片,然后将其转化为缩放后的bitmap
100*
101*@parampath
102*/
103publicstaticvoidsaveBefore(Stringpath){
104BitmapFactory.Optionsoptions=newBitmapFactory.Options();
105options.inJustDecodeBounds=true;
106//获取这个图片的宽和高
107Bitmapbitmap=BitmapFactory.decodeFile(path,options);//此时返回bm为空
108options.inJustDecodeBounds=false;
109//计算缩放比
110intbe=(int)(options.outHeight/(float)200);
111if(be<=0)
112be=1;
113options.inSampleSize=2;//图片长宽各缩小二分之一
114//重新读入图片,注意这次要把options.inJustDecodeBounds设为false哦
115bitmap=BitmapFactory.decodeFile(path,options);
116intw=bitmap.getWidth();
117inth=bitmap.getHeight();
118System.out.println(w+""+h);
119//savePNG_After(bitmap,path);
120saveJPGE_After(bitmap,path);
121}
122/**
123*保存图片为PNG
124*
125*@parambitmap
126*@paramname
127*/
128publicstaticvoidsavePNG_After(Bitmapbitmap,Stringname){
129Filefile=newFile(name);
130try{
131FileOutputStreamout=newFileOutputStream(file);
132if(bitmap.compress(Bitmap.CompressFormat.PNG,100,out)){
133out.flush();
134out.close();
135}
136}catch(FileNotFoundExceptione){
137e.printStackTrace();
138}catch(IOExceptione){
139e.printStackTrace();
140}
141}
142/**
143*保存图片为JPEG
144*
145*@parambitmap
146*@parampath
147*/
148publicstaticvoidsaveJPGE_After(Bitmapbitmap,Stringpath){
149Filefile=newFile(path);
150try{
151FileOutputStreamout=newFileOutputStream(file);
152if(bitmap.compress(Bitmap.CompressFormat.JPEG,100,out)){
153out.flush();
154out.close();
155}
156}catch(FileNotFoundExceptione){
157e.printStackTrace();
158}catch(IOExceptione){
159e.printStackTrace();
160}
161}
162/**
163*水印
164*
165*@parambitmap
166*@return
167*/
168publicstaticBitmapcreateBitmapForWatermark(Bitmapsrc,Bitmapwatermark){
169if(src==null){
170returnnull;
171}
172intw=src.getWidth();
173inth=src.getHeight();
174intww=watermark.getWidth();
175intwh=watermark.getHeight();
176//createthenewblankbitmap
177Bitmapnewb=Bitmap.createBitmap(w,h,Config.ARGB_8888);//创建一个新的和SRC长度宽度一样的位图
178Canvascv=newCanvas(newb);
179//drawsrcinto
180cv.drawBitmap(src,0,0,null);//在0,0坐标开始画入src
181//drawwatermarkinto
182cv.drawBitmap(watermark,w-ww+5,h-wh+5,null);//在src的右下角画入水印
183//saveallclip
184cv.save(Canvas.ALL_SAVE_FLAG);//保存
185//store
186cv.restore();//存储
187returnnewb;
188}
189/**
190*图片合成
191*
192*@return
193*/
194publicstaticBitmappotoMix(intdirection,Bitmap...bitmaps){
195if(bitmaps.length<=0){
196returnnull;
197}
198if(bitmaps.length==1){
199returnbitmaps[0];
200}
201BitmapnewBitmap=bitmaps[0];
202//newBitmap=createBitmapForFotoMix(bitmaps[0],bitmaps[1],direction);
203for(inti=1;i<bitmaps.length;i++){
204newBitmap=createBitmapForFotoMix(newBitmap,bitmaps[i],direction);
205}
206returnnewBitmap;
207}
208
209privatestaticBitmapcreateBitmapForFotoMix(Bitmapfirst,Bitmapsecond,intdirection){
210if(first==null){
211returnnull;
212}
213if(second==null){
214returnfirst;
215}
216intfw=first.getWidth();
217intfh=first.getHeight();
218intsw=second.getWidth();
219intsh=second.getHeight();
220BitmapnewBitmap=null;
221if(direction==LEFT){
222newBitmap=Bitmap.createBitmap(fw+sw,fh>sh?fh:sh,Config.ARGB_8888);
223Canvascanvas=newCanvas(newBitmap);
224canvas.drawBitmap(first,sw,0,null);
225canvas.drawBitmap(second,0,0,null);
226}elseif(direction==RIGHT){
227newBitmap=Bitmap.createBitmap(fw+sw,fh>sh?fh:sh,Config.ARGB_8888);
228Canvascanvas=newCanvas(newBitmap);
229canvas.drawBitmap(first,0,0,null);
230canvas.drawBitmap(second,fw,0,null);
231}elseif(direction==TOP){
232newBitmap=Bitmap.createBitmap(sw>fw?sw:fw,fh+sh,Config.ARGB_8888);
233Canvascanvas=newCanvas(newBitmap);
234canvas.drawBitmap(first,0,sh,null);
235canvas.drawBitmap(second,0,0,null);
236}elseif(direction==BOTTOM){
237newBitmap=Bitmap.createBitmap(sw>fw?sw:fw,fh+sh,Config.ARGB_8888);
238Canvascanvas=newCanvas(newBitmap);
239canvas.drawBitmap(first,0,0,null);
240canvas.drawBitmap(second,0,fh,null);
241}
242returnnewBitmap;
243}
244/**
245*将Bitmap转换成指定大小
246*@parambitmap
247*@paramwidth
248*@paramheight
249*@return
250*/
251publicstaticBitmapcreateBitmapBySize(Bitmapbitmap,intwidth,intheight)
252{
253returnBitmap.createScaledBitmap(bitmap,width,height,true);
254}
255/**
256*Drawable转Bitmap
257*
258*@paramdrawable
259*@return
260*/
261publicstaticBitmapdrawableToBitmapByBD(Drawabledrawable){
262BitmapDrawablebitmapDrawable=(BitmapDrawable)drawable;
263returnbitmapDrawable.getBitmap();
264}
265/**
266*Bitmap转Drawable
267*
268*@parambitmap
269*@return
270*/
271publicstaticDrawablebitmapToDrawableByBD(Bitmapbitmap){
272Drawabledrawable=newBitmapDrawable(bitmap);
273returndrawable;
274}
275/**
276*byte[]转bitmap
277*
278*@paramb
279*@return
280*/
281publicstaticBitmapbytesToBimap(byte[]b){
282if(b.length!=0){
283returnBitmapFactory.decodeByteArray(b,0,b.length);
284}else{
285returnnull;
286}
287}
288/**
289*bitmap转byte[]
290*
291*@parambm
292*@return
293*/
294publicstaticbyte[]bitmapToBytes(Bitmapbm){
295ByteArrayOutputStreambaos=newByteArrayOutputStream();
296bm.compress(Bitmap.CompressFormat.PNG,100,baos);
297returnbaos.toByteArray();
298}
299}