android Bimtap 各种图片处理方法、图片特效
16lz
2021-01-23
原帖地址:http://gundumw100.iteye.com/blog/849729
Java代码
Java代码
将一个图片切割成多个图片
有种场景,我们想将一个图片切割成多个图片。比如我们在开发一个拼图的游戏,就首先要对图片进行切割。
以下是封装好的两个类,可以实现图片的切割。仅供参考和学习。
一个是ImagePiece类,此类保存了一个Bitmap对象和一个标识图片的顺序索引的int变量。
Java代码
一个是ImageSplitter类,有一个静态方法split,传入的参数是要切割的Bitmap对象,和横向和竖向的切割片数。比如传入的是3、3,则横竖向都切割成3片,最终会将整个图片切割成3X3=9片。
Java代码
1、图标加灰色过滤;
2、android的图片资源默认是静态的,单实例;如果两个IM好友的头像一样,最简单的都是用的软件自带头像,有一个在线,一个离线,直接改变头像的灰度,则两个用户的头像都会变灰或者在线,答案是:Drawable.mutate()。
Java代码
生成缩略图,抠自android launcher源码:
Java代码
Java代码
Java代码
Java代码
Java代码
Java代码
Java代码
绘制图像倒影
Java代码
Android 繪圖座標體系預設的原點在左上角,X 軸往右是越來越大的正值,而 Y 軸往下,則是越來越大的正值。要畫出垂直翻轉的圖片,其實也就是要垂直翻轉整個繪圖座標體系。在 Android 中,要如何做?答案就是 canvas.scale(1.0f, -1.0f)。很簡單吧,沒想到給 scale() 函式一個負值,就可以翻轉相對應的軸。
在 Photoshop 中,做鏡像特效的第二步是要對這翻轉的圖片,加個由灰到黑的漸層 mask。
在 Android 中,要畫漸層色,那就一定得用 LinearGradient 這個類別。至於要對背景圖加上個 mask,就請參考一下 Paint 的 setXfermode() 函式。_Init() 這個函式,就是負責生成一個由灰到黑漸層 mask 的 m_paint 物件。
http://blog.csdn.net/Android_Tutor/archive/2010/11/02/5981753.aspx
http://www.cnblogs.com/TerryBlog/archive/2012/01/08/2316482.html
android常用图片特效处理
http://www.eoeandroid.com/thread-170526-1-1.html
相机(Camera)实时滤镜效果
http://www.eoeandroid.com/thread-171528-1-1.html
Android, WindowsPhone7, IOS ,vc2010平台40多套图片滤镜开源
http://www.cnblogs.com/daizhj/archive/2012/05/15/2501406.html
Android实现获取本机中所有图片
http://www.cnblogs.com/hanyonglu/archive/2012/05/10/2494908.html
Java代码
- //压缩图片大小
- publicstaticBitmapcompressImage(Bitmapimage){
- ByteArrayOutputStreambaos=newByteArrayOutputStream();
- image.compress(Bitmap.CompressFormat.JPEG,100,baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
- intoptions=100;
- while(baos.toByteArray().length/1024>100){//循环判断如果压缩后图片是否大于100kb,大于继续压缩
- baos.reset();//重置baos即清空baos
- image.compress(Bitmap.CompressFormat.JPEG,options,baos);//这里压缩options%,把压缩后的数据存放到baos中
- options-=10;//每次都减少10
- }
- ByteArrayInputStreamisBm=newByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中
- Bitmapbitmap=BitmapFactory.decodeStream(isBm,null,null);//把ByteArrayInputStream数据生成图片
- returnbitmap;
- }
Java代码
- /**
- *将彩色图转换为灰度图
- *@paramimg位图
- *@return返回转换好的位图
- */
- publicBitmapconvertGreyImg(Bitmapimg){
- intwidth=img.getWidth();//获取位图的宽
- intheight=img.getHeight();//获取位图的高
- int[]pixels=newint[width*height];//通过位图的大小创建像素点数组
- img.getPixels(pixels,0,width,0,0,width,height);
- intalpha=0xFF<<24;
- for(inti=0;i<height;i++){
- for(intj=0;j<width;j++){
- intgrey=pixels[width*i+j];
- intred=((grey&0x00FF0000)>>16);
- intgreen=((grey&0x0000FF00)>>8);
- intblue=(grey&0x000000FF);
- grey=(int)((float)red*0.3+(float)green*0.59+(float)blue*0.11);
- grey=alpha|(grey<<16)|(grey<<8)|grey;
- pixels[width*i+j]=grey;
- }
- }
- Bitmapresult=Bitmap.createBitmap(width,height,Config.RGB_565);
- result.setPixels(pixels,0,width,0,0,width,height);
- returnresult;
- }
将一个图片切割成多个图片
有种场景,我们想将一个图片切割成多个图片。比如我们在开发一个拼图的游戏,就首先要对图片进行切割。
以下是封装好的两个类,可以实现图片的切割。仅供参考和学习。
一个是ImagePiece类,此类保存了一个Bitmap对象和一个标识图片的顺序索引的int变量。
Java代码
- importandroid.graphics.Bitmap;
- publicclassImagePiece{
- publicintindex=0;
- publicBitmapbitmap=null;
- }
一个是ImageSplitter类,有一个静态方法split,传入的参数是要切割的Bitmap对象,和横向和竖向的切割片数。比如传入的是3、3,则横竖向都切割成3片,最终会将整个图片切割成3X3=9片。
Java代码
- importjava.util.ArrayList;
- importjava.util.List;
- importandroid.graphics.Bitmap;
- publicclassImageSplitter{
- publicstaticList<ImagePiece>split(Bitmapbitmap,intxPiece,intyPiece){
- List<ImagePiece>pieces=newArrayList<ImagePiece>(xPiece*yPiece);
- intwidth=bitmap.getWidth();
- intheight=bitmap.getHeight();
- intpieceWidth=width/3;
- intpieceHeight=height/3;
- for(inti=0;i<yPiece;i++){
- for(intj=0;j<xPiece;j++){
- ImagePiecepiece=newImagePiece();
- piece.index=j+i*xPiece;
- intxValue=j*pieceWidth;
- intyValue=i*pieceHeight;
- piece.bitmap=Bitmap.createBitmap(bitmap,xValue,yValue,
- pieceWidth,pieceHeight);
- pieces.add(piece);
- }
- }
- returnpieces;
- }
- }
1、图标加灰色过滤;
2、android的图片资源默认是静态的,单实例;如果两个IM好友的头像一样,最简单的都是用的软件自带头像,有一个在线,一个离线,直接改变头像的灰度,则两个用户的头像都会变灰或者在线,答案是:Drawable.mutate()。
Java代码
- DrawablemDrawable=context.getResources().getDrawable(R.drawable.face_icon);
- //Makethisdrawablemutable.
- //Amutabledrawableisguaranteedtonotshareitsstatewithanyotherdrawable.
- mDrawable.mutate();
- ColorMatrixcm=newColorMatrix();
- cm.setSaturation(0);
- ColorMatrixColorFiltercf=newColorMatrixColorFilter(cm);
- mDrawable.setColorFilter(cf);
生成缩略图,抠自android launcher源码:
Java代码
- /*
- *Copyright(C)2008TheAndroidOpenSourceProject
- *
- *LicensedundertheApacheLicense,Version2.0(the"License");
- *youmaynotusethisfileexceptincompliancewiththeLicense.
- *YoumayobtainacopyoftheLicenseat
- *
- *http://www.apache.org/licenses/LICENSE-2.0
- *
- *Unlessrequiredbyapplicablelaworagreedtoinwriting,software
- *distributedundertheLicenseisdistributedonan"ASIS"BASIS,
- *WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.
- *SeetheLicenseforthespecificlanguagegoverningpermissionsand
- *limitationsundertheLicense.
- */
- packagecom.android.launcher;
- importandroid.graphics.drawable.BitmapDrawable;
- importandroid.graphics.drawable.Drawable;
- importandroid.graphics.drawable.PaintDrawable;
- importandroid.graphics.Bitmap;
- importandroid.graphics.PixelFormat;
- importandroid.graphics.Canvas;
- importandroid.graphics.PaintFlagsDrawFilter;
- importandroid.graphics.Paint;
- importandroid.graphics.Rect;
- importandroid.content.res.Resources;
- importandroid.content.Context;
- /**
- *VariousutilitiessharedamongsttheLauncher'sclasses.
- */
- finalclassUtilities{
- privatestaticintsIconWidth=-1;
- privatestaticintsIconHeight=-1;
- privatestaticfinalPaintsPaint=newPaint();
- privatestaticfinalRectsBounds=newRect();
- privatestaticfinalRectsOldBounds=newRect();
- privatestaticCanvassCanvas=newCanvas();
- static{
- sCanvas.setDrawFilter(newPaintFlagsDrawFilter(Paint.DITHER_FLAG,
- Paint.FILTER_BITMAP_FLAG));
- }
- /**
- *ReturnsaDrawablerepresentingthethumbnailofthespecifiedDrawable.
- *Thesizeofthethumbnailisdefinedbythedimension
- *android.R.dimen.launcher_application_icon_size.
- *
- *Thismethodisnotthread-safeandshouldbeinvokedontheUIthreadonly.
- *
- *@paramiconTheicontogetathumbnailof.
- *@paramcontextTheapplication'scontext.
- *
- *@returnAthumbnailforthespecifiediconortheiconitselfifthe
- *thumbnailcouldnotbecreated.
- */
- staticDrawablecreateIconThumbnail(Drawableicon,Contextcontext){
- if(sIconWidth==-1){
- finalResourcesresources=context.getResources();
- sIconWidth=sIconHeight=(int)resources.getDimension(android.R.dimen.app_icon_size);
- }
- intwidth=sIconWidth;
- intheight=sIconHeight;
- floatscale=1.0f;
- if(iconinstanceofPaintDrawable){
- PaintDrawablepainter=(PaintDrawable)icon;
- painter.setIntrinsicWidth(width);
- painter.setIntrinsicHeight(height);
- }elseif(iconinstanceofBitmapDrawable){
- //Ensurethebitmaphasadensity.
- BitmapDrawablebitmapDrawable=(BitmapDrawable)icon;
- Bitmapbitmap=bitmapDrawable.getBitmap();
- if(bitmap.getDensity()==Bitmap.DENSITY_NONE){
- bitmapDrawable.setTargetDensity(context.getResources().getDisplayMetrics());
- }
- }
- inticonWidth=icon.getIntrinsicWidth();
- inticonHeight=icon.getIntrinsicHeight();
- if(width>0&&height>0){
- if(width<iconWidth||height<iconHeight||scale!=1.0f){
- finalfloatratio=(float)iconWidth/iconHeight;
- if(iconWidth>iconHeight){
- height=(int)(width/ratio);
- }elseif(iconHeight>iconWidth){
- width=(int)(height*ratio);
- }
- finalBitmap.Configc=icon.getOpacity()!=PixelFormat.OPAQUE?
- Bitmap.Config.ARGB_8888:Bitmap.Config.RGB_565;
- finalBitmapthumb=Bitmap.createBitmap(sIconWidth,sIconHeight,c);
- finalCanvascanvas=sCanvas;
- canvas.setBitmap(thumb);
- //Copytheoldboundstorestorethemlater
- //IfweweretodooldBounds=icon.getBounds(),
- //thecalltosetBounds()thatfollowswould
- //changethesameinstanceandwewouldlosethe
- //oldbounds
- sOldBounds.set(icon.getBounds());
- finalintx=(sIconWidth-width)/2;
- finalinty=(sIconHeight-height)/2;
- icon.setBounds(x,y,x+width,y+height);
- icon.draw(canvas);
- icon.setBounds(sOldBounds);
- icon=newFastBitmapDrawable(thumb);
- }elseif(iconWidth<width&&iconHeight<height){
- finalBitmap.Configc=Bitmap.Config.ARGB_8888;
- finalBitmapthumb=Bitmap.createBitmap(sIconWidth,sIconHeight,c);
- finalCanvascanvas=sCanvas;
- canvas.setBitmap(thumb);
- sOldBounds.set(icon.getBounds());
- finalintx=(width-iconWidth)/2;
- finalinty=(height-iconHeight)/2;
- icon.setBounds(x,y,x+iconWidth,y+iconHeight);
- icon.draw(canvas);
- icon.setBounds(sOldBounds);
- icon=newFastBitmapDrawable(thumb);
- }
- }
- returnicon;
- }
- /**
- *ReturnsaBitmaprepresentingthethumbnailofthespecifiedBitmap.
- *Thesizeofthethumbnailisdefinedbythedimension
- *android.R.dimen.launcher_application_icon_size.
- *
- *Thismethodisnotthread-safeandshouldbeinvokedontheUIthreadonly.
- *
- *@parambitmapThebitmaptogetathumbnailof.
- *@paramcontextTheapplication'scontext.
- *
- *@returnAthumbnailforthespecifiedbitmaporthebitmapitselfifthe
- *thumbnailcouldnotbecreated.
- */
- staticBitmapcreateBitmapThumbnail(Bitmapbitmap,Contextcontext){
- if(sIconWidth==-1){
- finalResourcesresources=context.getResources();
- sIconWidth=sIconHeight=(int)resources.getDimension(
- android.R.dimen.app_icon_size);
- }
- intwidth=sIconWidth;
- intheight=sIconHeight;
- finalintbitmapWidth=bitmap.getWidth();
- finalintbitmapHeight=bitmap.getHeight();
- if(width>0&&height>0){
- if(width<bitmapWidth||height<bitmapHeight){
- finalfloatratio=(float)bitmapWidth/bitmapHeight;
- if(bitmapWidth>bitmapHeight){
- height=(int)(width/ratio);
- }elseif(bitmapHeight>bitmapWidth){
- width=(int)(height*ratio);
- }
- finalBitmap.Configc=(width==sIconWidth&&height==sIconHeight)?
- bitmap.getConfig():Bitmap.Config.ARGB_8888;
- finalBitmapthumb=Bitmap.createBitmap(sIconWidth,sIconHeight,c);
- finalCanvascanvas=sCanvas;
- finalPaintpaint=sPaint;
- canvas.setBitmap(thumb);
- paint.setDither(false);
- paint.setFilterBitmap(true);
- sBounds.set((sIconWidth-width)/2,(sIconHeight-height)/2,width,height);
- sOldBounds.set(0,0,bitmapWidth,bitmapHeight);
- canvas.drawBitmap(bitmap,sOldBounds,sBounds,paint);
- returnthumb;
- }elseif(bitmapWidth<width||bitmapHeight<height){
- finalBitmap.Configc=Bitmap.Config.ARGB_8888;
- finalBitmapthumb=Bitmap.createBitmap(sIconWidth,sIconHeight,c);
- finalCanvascanvas=sCanvas;
- finalPaintpaint=sPaint;
- canvas.setBitmap(thumb);
- paint.setDither(false);
- paint.setFilterBitmap(true);
- canvas.drawBitmap(bitmap,(sIconWidth-bitmapWidth)/2,
- (sIconHeight-bitmapHeight)/2,paint);
- returnthumb;
- }
- }
- returnbitmap;
- }
- }
Java代码
- //AndroidMatrix类实现镜像方法
- publicvoiddrawRegion(Imageimage_src,
- intx_src,inty_src,
- intwidth,intheight,
- inttransform,
- intx_dest,inty_dest,
- intanchor){
- if((anchor&VCENTER)!=0){
- y_dest-=height/2;
- }elseif((anchor&BOTTOM)!=0){
- y_dest-=height;
- }
- if((anchor&RIGHT)!=0){
- x_dest-=width;
- }elseif((anchor&HCENTER)!=0){
- x_dest-=width/2;
- }
- BitmapnewMap=Bitmap.createBitmap(image_src.getBitmap(),x_src,y_src,width,height);
- MatrixmMatrix=newMatrix();
- Matrixtemp=newMatrix();
- Matrixtemp2=newMatrix();
- float[]mirrorY={
- -1,0,0,
- 0,1,0,
- 0,0,1
- };
- temp.setValues(mirrorY);
- switch(transform){
- caseSprite.TRANS_NONE:
- break;
- caseSprite.TRANS_ROT90:
- mMatrix.setRotate(90,width/2,height/2);
- break;
- caseSprite.TRANS_ROT180:
- mMatrix.setRotate(180,width/2,height/2);
- break;
- caseSprite.TRANS_ROT270:
- mMatrix.setRotate(270,width/2,height/2);
- break;
- caseSprite.TRANS_MIRROR:
- mMatrix.postConcat(temp);
- break;
- caseSprite.TRANS_MIRROR_ROT90:
- mMatrix.postConcat(temp);
- mMatrix.setRotate(90,width/2,height/2);
- break;
- caseSprite.TRANS_MIRROR_ROT180:
- mMatrix.postConcat(temp);
- mMatrix.setRotate(180,width/2,height/2);
- break;
- caseSprite.TRANS_MIRROR_ROT270:
- mMatrix.postConcat(temp);
- mMatrix.setRotate(270,width/2,height/2);
- break;
- }
- mMatrix.setTranslate(x_dest,y_dest);
- canvas.drawBitmap(newMap,mMatrix,mPaint);
- }
Java代码
- //图片Url保存为位图并进行缩放操作
- //通过传入图片url获取位图方法
- publicBitmapreturnBitMap(Stringurl){
- URLmyFileUrl=null;
- Bitmapbitmap=null;
- try{
- myFileUrl=newURL(url);
- }catch(MalformedURLExceptione){
- e.printStackTrace();
- }
- try{
- HttpURLConnectionconn=(HttpURLConnection)myFileUrl
- .openConnection();
- conn.setDoInput(true);
- conn.connect();
- InputStreamis=conn.getInputStream();
- bitmap=BitmapFactory.decodeStream(is);
- is.close();
- }catch(IOExceptione){
- e.printStackTrace();
- }
- Log.v(tag,bitmap.toString());
- returnbitmap;
- }
- //通过传入位图,新的宽.高比进行位图的缩放操作
- publicstaticDrawableresizeImage(Bitmapbitmap,intw,inth){
- //loadtheorigialBitmap
- BitmapBitmapOrg=bitmap;
- intwidth=BitmapOrg.getWidth();
- intheight=BitmapOrg.getHeight();
- intnewWidth=w;
- intnewHeight=h;
- Log.v(tag,String.valueOf(width));
- Log.v(tag,String.valueOf(height));
- Log.v(tag,String.valueOf(newWidth));
- Log.v(tag,String.valueOf(newHeight));
- //calculatethescale
- floatscaleWidth=((float)newWidth)/width;
- floatscaleHeight=((float)newHeight)/height;
- //createamatrixforthemanipulation
- Matrixmatrix=newMatrix();
- //resizetheBitmap
- matrix.postScale(scaleWidth,scaleHeight);
- //ifyouwanttorotatetheBitmap
- //matrix.postRotate(45);
- //recreatethenewBitmap
- BitmapresizedBitmap=Bitmap.createBitmap(BitmapOrg,0,0,width,
- height,matrix,true);
- //makeaDrawablefromBitmaptoallowtosettheBitmap
- //totheImageView,ImageButtonorwhatever
- returnnewBitmapDrawable(resizedBitmap);
- }
Java代码
- 1.图片加载方法,方便用户加载图片
- /***
- *加载本地图片
- *@paramcontext:主运行函数实例
- *@parambitAdress:图片地址,一般指向R下的drawable目录
- *@return
- */
- publicfinalBitmapCreatImage(Contextcontext,intbitAdress){
- Bitmapbitmaptemp=null;
- bitmaptemp=BitmapFactory.decodeResource(context.getResources(),
- bitAdress);
- returnbitmaptemp;
- }
- 2.图片平均分割方法,将大图平均分割为N行N列,方便用户使用
- /***
- *图片分割
- *
- *@paramg
- *:画布
- *@parampaint
- *:画笔
- *@paramimgBit
- *:图片
- *@paramx
- *:X轴起点坐标
- *@paramy
- *:Y轴起点坐标
- *@paramw
- *:单一图片的宽度
- *@paramh
- *:单一图片的高度
- *@paramline
- *:第几列
- *@paramrow
- *:第几行
- */
- publicfinalvoidcuteImage(Canvasg,Paintpaint,BitmapimgBit,intx,
- inty,intw,inth,intline,introw){
- g.clipRect(x,y,x+w,h+y);
- g.drawBitmap(imgBit,x–line*w,y–row*h,paint);
- g.restore();
- }
- 3.图片缩放,对当前图片进行缩放处理
- /***
- *图片的缩放方法
- *
- *@parambgimage
- *:源图片资源
- *@paramnewWidth
- *:缩放后宽度
- *@paramnewHeight
- *:缩放后高度
- *@return
- */
- publicBitmapzoomImage(Bitmapbgimage,intnewWidth,intnewHeight){
- //获取这个图片的宽和高
- intwidth=bgimage.getWidth();
- intheight=bgimage.getHeight();
- //创建操作图片用的matrix对象
- Matrixmatrix=newMatrix();
- //计算缩放率,新尺寸除原始尺寸
- floatscaleWidth=((float)newWidth)/width;
- floatscaleHeight=((float)newHeight)/height;
- //缩放图片动作
- matrix.postScale(scaleWidth,scaleHeight);
- Bitmapbitmap=Bitmap.createBitmap(bgimage,0,0,width,height,
- matrix,true);
- returnbitmap;
- }
- 4.绘制带有边框的文字,一般在游戏中起文字的美化作用
- /***
- *绘制带有边框的文字
- *
- *@paramstrMsg
- *:绘制内容
- *@paramg
- *:画布
- *@parampaint
- *:画笔
- *@paramsetx
- *::X轴起始坐标
- *@paramsety
- *:Y轴的起始坐标
- *@paramfg
- *:前景色
- *@parambg
- *:背景色
- */
- publicvoiddrawText(StringstrMsg,Canvasg,Paintpaint,intsetx,
- intsety,intfg,intbg){
- paint.setColor(bg);
- g.drawText(strMsg,setx+1,sety,paint);
- g.drawText(strMsg,setx,sety–1,paint);
- g.drawText(strMsg,setx,sety+1,paint);
- g.drawText(strMsg,setx–1,sety,paint);
- paint.setColor(fg);
- g.drawText(strMsg,setx,sety,paint);
- g.restore();
- }
- 5.Android图片透明度处理代码
- /**
- *图片透明度处理
- *
- *@paramsourceImg
- *原始图片
- *@paramnumber
- *透明度
- *@return
- */
- publicstaticBitmapsetAlpha(BitmapsourceImg,intnumber){
- int[]argb=newint[sourceImg.getWidth()*sourceImg.getHeight()];
- sourceImg.getPixels(argb,0,sourceImg.getWidth(),0,0,sourceImg.getWidth(),sourceImg.getHeight());//获得图片的ARGB值
- number=number*255/100;
- for(inti=0;i<argb.length;i++){
- argb=(number<<24)|(argb&0×00FFFFFF);//修改最高2位的值
- }
- sourceImg=Bitmap.createBitmap(argb,sourceImg.getWidth(),sourceImg.getHeight(),Config.ARGB_8888);
- returnsourceImg;
- }
- 6.图片翻转
- Resourcesres=this.getContext().getResources();
- img=BitmapFactory.decodeResource(res,R.drawable.slogo);
- Matrixmatrix=newMatrix();
- matrix.postRotate(90);/*翻转90度*/
- intwidth=img.getWidth();
- intheight=img.getHeight();
- r_img=Bitmap.createBitmap(img,0,0,width,height,matrix,true);
Java代码
- importandroid.graphics.Bitmap;
- importandroid.graphics.Canvas;
- importandroid.graphics.LinearGradient;
- importandroid.graphics.Matrix;
- importandroid.graphics.Paint;
- importandroid.graphics.PixelFormat;
- importandroid.graphics.PorterDuffXfermode;
- importandroid.graphics.Rect;
- importandroid.graphics.RectF;
- importandroid.graphics.Bitmap.Config;
- importandroid.graphics.PorterDuff.Mode;
- importandroid.graphics.Shader.TileMode;
- importandroid.graphics.drawable.Drawable;
- /**
- *
- *@authorsuperdev
- *@version1.0
- *
- */
- publicclassImageUtil{
- /**
- *放大缩小图片
- */
- publicstaticBitmapzoomBitmap(Bitmapbitmap,intw,inth){
- intwidth=bitmap.getWidth();
- intheight=bitmap.getHeight();
- Matrixmatrix=newMatrix();
- floatscaleWidht=((float)w/width);
- floatscaleHeight=((float)h/height);
- matrix.postScale(scaleWidht,scaleHeight);
- Bitmapnewbmp=Bitmap.createBitmap(bitmap,0,0,width,height,matrix,true);
- returnnewbmp;
- }
- /**
- *将Drawable转化为Bitmap
- */
- publicstaticBitmapdrawableToBitmap(Drawabledrawable){
- intwidth=drawable.getIntrinsicWidth();
- intheight=drawable.getIntrinsicHeight();
- Bitmapbitmap=Bitmap.createBitmap(width,height,drawable.getOpacity()!=PixelFormat.OPAQUE?Bitmap.Config.ARGB_8888:Bitmap.Config.RGB_565);
- Canvascanvas=newCanvas(bitmap);
- drawable.setBounds(0,0,width,height);
- drawable.draw(canvas);
- returnbitmap;
- }
- /**
- *获得圆角图片的方法
- */
- publicstaticBitmapgetRoundedCornerBitmap(Bitmapbitmap,floatroundPx){
- Bitmapoutput=Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(),Config.ARGB_8888);
- Canvascanvas=newCanvas(output);
- finalintcolor=0xff424242;
- finalPaintpaint=newPaint();
- finalRectrect=newRect(0,0,bitmap.getWidth(),bitmap.getHeight());
- finalRectFrectF=newRectF(rect);
- paint.setAntiAlias(true);
- canvas.drawARGB(0,0,0,0);
- paint.setColor(color);
- canvas.drawRoundRect(rectF,roundPx,roundPx,paint);
- paint.setXfermode(newPorterDuffXfermode(Mode.SRC_IN));
- canvas.drawBitmap(bitmap,rect,rect,paint);
- returnoutput;
- }
- /**
- *获得带倒影的图片方法
- */
- publicstaticBitmapcreateReflectionImageWithOrigin(Bitmapbitmap){
- finalintreflectionGap=4;
- intwidth=bitmap.getWidth();
- intheight=bitmap.getHeight();
- Matrixmatrix=newMatrix();
- matrix.preScale(1,-1);
- BitmapreflectionImage=Bitmap.createBitmap(bitmap,0,height/2,width,height/2,matrix,false);
- BitmapbitmapWithReflection=Bitmap.createBitmap(width,(height+height/2),Config.ARGB_8888);
- Canvascanvas=newCanvas(bitmapWithReflection);
- canvas.drawBitmap(bitmap,0,0,null);
- PaintdeafalutPaint=newPaint();
- canvas.drawRect(0,height,width,height+reflectionGap,deafalutPaint);
- canvas.drawBitmap(reflectionImage,0,height+reflectionGap,null);
- Paintpaint=newPaint();
- LinearGradientshader=newLinearGradient(0,bitmap.getHeight(),0,bitmapWithReflection.getHeight()+reflectionGap,0x70ffffff,0x00ffffff,TileMode.CLAMP);
- paint.setShader(shader);
- //SettheTransfermodetobeporterduffanddestinationin
- paint.setXfermode(newPorterDuffXfermode(Mode.DST_IN));
- //Drawarectangleusingthepaintwithourlineargradient
- canvas.drawRect(0,height,width,bitmapWithReflection.getHeight()+reflectionGap,paint);
- returnbitmapWithReflection;
- }
- }
Java代码
- privatebyte[]Bitmap2Bytes(Bitmapbm){
- ByteArrayOutputStreambaos=newByteArrayOutputStream();
- bm.compress(Bitmap.CompressFormat.PNG,100,baos);
- returnbaos.toByteArray();
- }
- privateBitmapBytes2Bimap(byte[]b){
- if(b.length!=0){
- returnBitmapFactory.decodeByteArray(b,0,b.length);
- }
- else{
- returnnull;
- }
- }
- /**
- *createthebitmapfromabytearray
- *生成水印图片
- *@paramsrcthebitmapobjectyouwantproecss
- *@paramwatermarkthewatermarkabovethesrc
- *@returnreturnabitmapobject,ifparamter'slengthis0,returnnull
- */
- privateBitmapcreateBitmap(Bitmapsrc,Bitmapwatermark)
- {
- Stringtag="createBitmap";
- Log.d(tag,"createanewbitmap");
- if(src==null)
- {
- returnnull;
- }
- intw=src.getWidth();
- inth=src.getHeight();
- intww=watermark.getWidth();
- intwh=watermark.getHeight();
- //createthenewblankbitmap
- Bitmapnewb=Bitmap.createBitmap(w,h,Config.ARGB_8888);//创建一个新的和SRC长度宽度一样的位图
- Canvascv=newCanvas(newb);
- //drawsrcinto
- cv.drawBitmap(src,0,0,null);//在0,0坐标开始画入src
- //drawwatermarkinto
- cv.drawBitmap(watermark,w-ww+5,h-wh+5,null);//在src的右下角画入水印
- //saveallclip
- cv.save(Canvas.ALL_SAVE_FLAG);//保存
- //store
- cv.restore();//存储
- returnnewb;
- }
- /**重新编码Bitmap
- *
- *@paramsrc
- *需要重新编码的Bitmap
- *
- *@paramformat
- *编码后的格式(目前只支持png和jpeg这两种格式)
- *
- *@paramquality
- *重新生成后的bitmap的质量
- *
- *@return
- *返回重新生成后的bitmap
- */
- privatestaticBitmapcodec(Bitmapsrc,Bitmap.CompressFormatformat,
- intquality){
- ByteArrayOutputStreamos=newByteArrayOutputStream();
- src.compress(format,quality,os);
- byte[]array=os.toByteArray();
- returnBitmapFactory.decodeByteArray(array,0,array.length);
- }
- //Stream转换成Byte
- staticbyte[]streamToBytes(InputStreamis){
- ByteArrayOutputStreamos=newByteArrayOutputStream(1024);
- byte[]buffer=newbyte[1024];
- intlen;
- try{
- while((len=is.read(buffer))>=0){
- os.write(buffer,0,len);
- }
- }catch(java.io.IOExceptione){
- }
- returnos.toByteArray();
- }
- //把View转换成Bitmap
- /**
- *把一个View的对象转换成bitmap
- */
- staticBitmapgetViewBitmap(Viewv){
- v.clearFocus();
- v.setPressed(false);
- //能画缓存就返回false
- booleanwillNotCache=v.willNotCacheDrawing();
- v.setWillNotCacheDrawing(false);
- intcolor=v.getDrawingCacheBackgroundColor();
- v.setDrawingCacheBackgroundColor(0);
- if(color!=0){
- v.destroyDrawingCache();
- }
- v.buildDrawingCache();
- BitmapcacheBitmap=v.getDrawingCache();
- if(cacheBitmap==null){
- Log.e(TAG,"failedgetViewBitmap("+v+")",newRuntimeException());
- returnnull;
- }
- Bitmapbitmap=Bitmap.createBitmap(cacheBitmap);
- //Restoretheview
- v.destroyDrawingCache();
- v.setWillNotCacheDrawing(willNotCache);
- v.setDrawingCacheBackgroundColor(color);
- returnbitmap;
- }
Java代码
- 读取raw资源文件中的mp3文件,然后通过音乐播放器播放:
- /**
- *把mp3文件写入卡
- *
- *@paramfileName
- *输出的文件名(全路径)
- *@paramcontext
- *context对象
- */
- privatevoidwriteMP3ToSDcard(StringfileName,Contextcontext){
- byte[]buffer=newbyte[1024*8];
- intread;
- BufferedInputStreambin=newBufferedInputStream(context.getResources().openRawResource(R.raw.ring));
- try{
- BufferedOutputStreambout=newBufferedOutputStream(newFileOutputStream(fileName));
- while((read=bin.read(buffer))>-1){
- bout.write(buffer,0,read);
- }
- bout.flush();
- bout.close();
- bin.close();
- }catch(FileNotFoundExceptione){
- e.printStackTrace();
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- Intentintent=newIntent();
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- intent.setAction(android.content.Intent.ACTION_VIEW);
- intent.setDataAndType(Uri.fromFile(newFile("XXXXmp3的文件全路径")),"audio/*");
- startActivity(intent);
绘制图像倒影
Java代码
- privatevoid
- _Init()
- {
- m_paint=newPaint(Paint.ANTI_ALIAS_FLAG);
- LinearGradientlg=newLinearGradient(
- 0,0,0,m_nShadowH,
- 0xB0FFFFFF,0x00000000,
- Shader.TileMode.CLAMP);
- m_paint.setShader(lg);
- m_paint.setXfermode(newPorterDuffXfermode(PorterDuff.Mode.MULTIPLY));
- }
- @Overrideprotectedvoid
- onDraw(Canvascanvas)
- {
- super.onDraw(canvas);
- intnX=0;
- intnY=20;
- _DrawNormalImg(canvas,nX,nY);
- _DrawMirror(canvas,nX,nY);
- }
- privatevoid
- _DrawNormalImg(Canvascanvas,intnX,intnY)
- {
- canvas.save(Canvas.MATRIX_SAVE_FLAG);
- canvas.translate(nX,nY);
- m_dw.draw(canvas);
- canvas.restore();
- }
- privatevoid
- _DrawMirror(Canvascanvas,intnX,intnY)
- {
- intnW=m_dw.getIntrinsicWidth();
- intnH=m_dw.getIntrinsicHeight();
- ///////////////////////////////////
- //drawmirrorimage
- canvas.save(Canvas.MATRIX_SAVE_FLAG);
- canvas.scale(1.0f,-1.0f);
- canvas.translate(nX,-(nY+nH*2));
- canvas.clipRect(0,nH,nW,nH-m_nShadowH);
- m_dw.draw(canvas);
- canvas.restore();
- //////////////////////////////
- //drawmask
- canvas.save();
- canvas.translate(nX,nY+nH);
- canvas.drawRect(0,0,nW,m_nShadowH,m_paint);
- canvas.restore();
- }
Android 繪圖座標體系預設的原點在左上角,X 軸往右是越來越大的正值,而 Y 軸往下,則是越來越大的正值。要畫出垂直翻轉的圖片,其實也就是要垂直翻轉整個繪圖座標體系。在 Android 中,要如何做?答案就是 canvas.scale(1.0f, -1.0f)。很簡單吧,沒想到給 scale() 函式一個負值,就可以翻轉相對應的軸。
在 Photoshop 中,做鏡像特效的第二步是要對這翻轉的圖片,加個由灰到黑的漸層 mask。
在 Android 中,要畫漸層色,那就一定得用 LinearGradient 這個類別。至於要對背景圖加上個 mask,就請參考一下 Paint 的 setXfermode() 函式。_Init() 這個函式,就是負責生成一個由灰到黑漸層 mask 的 m_paint 物件。
http://blog.csdn.net/Android_Tutor/archive/2010/11/02/5981753.aspx
http://www.cnblogs.com/TerryBlog/archive/2012/01/08/2316482.html
android常用图片特效处理
http://www.eoeandroid.com/thread-170526-1-1.html
相机(Camera)实时滤镜效果
http://www.eoeandroid.com/thread-171528-1-1.html
Android, WindowsPhone7, IOS ,vc2010平台40多套图片滤镜开源
http://www.cnblogs.com/daizhj/archive/2012/05/15/2501406.html
Android实现获取本机中所有图片
http://www.cnblogs.com/hanyonglu/archive/2012/05/10/2494908.html
更多相关文章
- 下载显示网路图片的例子
- Android自动生成代码工具整理
- Android如何实现图片轮播
- Android不常用代码(1)
- Android获取网页源代码
- 图片拖动功能实现
- Android平台上实现图片的缩放,圆角,倒影效果
- android读取图片