Android实现图片反转、翻转、旋转、放大和缩小
Resourcesres=this.getContext().getResources(); img=BitmapFactory.decodeResource(res,R.drawable.aa); Matrixmatrix=newMatrix(); matrix.postRotate(180);/*翻转180度*/ intwidth=img.getWidth(); intheight=img.getHeight(); img_a=Bitmap.createBitmap(img,0,0,width,height,matrix,true);
然后可以直接把img_adraw到画布上,canvas.drawBitmap(img_a,10,10,p);
Matrix是一个处理翻转、缩放等图像效果的重要类,Matrix.postScale可设置缩放比例,默认为1
android实现图片的旋转
publicclassex04_22extendsActivity{ privateImageViewmImageView; privateButtonbtn1,btn2; privateTextViewmTextView; privateAbsoluteLayoutlayout1; privateintScaleTimes=1,ScaleAngle=1; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); mImageView=(ImageView)findViewById(R.id.myImageView); finalBitmapbmp=BitmapFactory.decodeResource(this.getResources(),R.drawable.ex04_22_1); finalintwidthOrig=bmp.getWidth(); finalintheightOrig=bmp.getHeight(); mImageView.setImageBitmap(bmp); btn1=(Button)findViewById(R.id.myButton1); btn1.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){ ScaleAngle--; if(ScaleAngle<-60){ ScaleAngle=-60; } intnewWidth=widthOrig*ScaleTimes; intnewHeight=heightOrig*ScaleTimes; floatscaleWidth=((float)newWidth)/widthOrig; floatscaleHeight=((float)newHeight)/heightOrig; Matrixmatrix=newMatrix(); matrix.postScale(scaleWidth,scaleHeight); matrix.setRotate(5*ScaleAngle); BitmapresizeBitmap=Bitmap.createBitmap(bmp,0,0,widthOrig,heightOrig,matrix,true); BitmapDrawablemyNewBitmapDrawable=newBitmapDrawable(resizeBitmap); mImageView.setImageDrawable(myNewBitmapDrawable); } }); btn2=(Button)findViewById(R.id.myButton2); btn2.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){ ScaleAngle++; if(ScaleAngle>60){ ScaleAngle=60; } intnewWidth=widthOrig*ScaleTimes; intnewHeight=heightOrig*ScaleTimes; floatscaleWidth=((float)newWidth)/widthOrig; floatscaleHeight=((float)newHeight)/heightOrig; Matrixmatrix=newMatrix(); matrix.postScale(scaleWidth,scaleHeight); matrix.setRotate(5*ScaleAngle); BitmapresizeBitmap=Bitmap.createBitmap(bmp,0,0,widthOrig,heightOrig,matrix,true); BitmapDrawablemyNewBitmapDrawable=newBitmapDrawable(resizeBitmap); mImageView.setImageDrawable(myNewBitmapDrawable); } }); }
alpha从255,逐渐递减!
如何实现屏幕的滚动效果,这里有两个关键点,一个是实现OnGestureListener,以便在触摸事件发生的时候,被回调。包括按下,滚动等等,按照API文档,需要分两步来实现检测手势行为。
1)创建GestureDetector实例
2)在onTouchEvent()方法中调用GestureDetector的onTouchEvent()方法。
另一个关键点是自己实现一个简单的View,来绘制图片。
代码如下所示。由于,我们不需要使用layout定义,所以不需要提供xml文件。
直接在程序里面setContentView()即可。
packagecom.j2medev; importandroid.app.Activity; importandroid.content.Context; importandroid.content.res.Resources; importandroid.graphics.Bitmap; importandroid.graphics.BitmapFactory; importandroid.graphics.Canvas; importandroid.graphics.Paint; importandroid.os.Bundle; importandroid.view.GestureDetector; importandroid.view.MotionEvent; importandroid.view.View; importandroid.view.ViewGroup; importandroid.view.GestureDetector.OnGestureListener; publicclassHorizontalScrollextendsActivityimplementsOnGestureListener{ privatestaticfinalintX_MAX=800; privatestaticfinalintY_MAX=600; privateintscrollX=0; privateintscrollY=0; MyViewmain; Bitmapbmp; Bitmapadapt; Resourcesres; Paintpaint; GestureDetectorgestureScanner; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); gestureScanner=newGestureDetector(this); paint=newPaint(); res=getResources(); bmp=BitmapFactory.decodeResource(res,R.drawable.arc); adapt=Bitmap.createBitmap(bmp); main=newMyView(this); setContentView(main,newViewGroup.LayoutParams(800,600)); } @Override publicbooleanonTouchEvent(MotionEventme){ returngestureScanner.onTouchEvent(me); } publicbooleanonScroll(MotionEvente1,MotionEvente2,floatdistanceX, floatdistanceY){ main.handleScroll(distanceX,distanceY); returntrue; } publicbooleanonDown(MotionEvente){ returntrue; } publicbooleanonFling(MotionEvente1,MotionEvente2,floatvelocityX, floatvelocityY){ returntrue; } publicvoidonLongPress(MotionEvente){ } publicvoidonShowPress(MotionEvente){ } publicbooleanonSingleTapUp(MotionEvente){ returntrue; } //////////////////// /////////////////// ////////////////// classMyViewextendsView{ publicMyView(Contextcontext){ super(context); } @Override protectedvoidonDraw(Canvascanvas){ canvas.drawBitmap(adapt,-scrollX,-scrollY,paint); } publicvoidhandleScroll(floatdistX,floatdistY){ //X-Axis//////////////////////////////// if(distX>6.0){ if(scrollX<460){ scrollX+=15; } }elseif(distX<-6.0){ if(scrollX>=15){ scrollX-=15; } } //////////////////////////////////////////// //Y-AXIS////////////////////////////////// if(distY>6.0){ if(scrollY<100){ scrollY+=15; } }elseif(distY<-6.0){ if(scrollY>=15){ scrollY-=15; } } //////////////////////////////////////////// // //if((scrollX<=480)&&(scrollY<=120)){ //adapt=Bitmap.createBitmap(bmp,scrollX,scrollY,320,480); //invalidate(); //} invalidate(); } } }
操作图像像素
现在你可以对单独的像素进行处理了。通过使用android.graphics.BitmapAPI中的getPixels,可以加载像素到一个整数数组中。
在本文例子中,你将按照一定规则对每一个像素实现着色。经过这个处理后,所有的像素将被转化为一个范围在0到255的字节码。
android.graphics.BitmapAPI中的setPixels则用来加载这个整数数组到一个图像中。
最后一步是通过ImageView变量mIV来更新屏幕。以下是实现这个染色过程的代码片段。
privatevoidTintThePicture(intdeg){ int[]pix=newint[picw*pich]; mBitmap.getPixels(pix,0,picw,0,0,picw,pich); intRY,GY,BY,RYY,GYY,BYY,R,G,B,Y; doubleangle=(3.14159d*(double)deg)/180.0d; intS=(int)(256.0d*Math.sin(angle)); intC=(int)(256.0d*Math.cos(angle)); for(inty=0;y<pich;y++) for(intx=0;x<picw;x++) { intindex=y*picw+x; intr=(pix[index]>>16)&0xff; intg=(pix[index]>>8)&0xff; intb=pix[index]&0xff; RY=(70*r-59*g-11*b)/100; GY=(-30*r+41*g-11*b)/100; BY=(-30*r-59*g+89*b)/100; Y=(30*r+59*g+11*b)/100; RYY=(S*BY+C*RY)/256; BYY=(C*BY-S*RY)/256; GYY=(-51*RYY-19*BYY)/100; R=Y+RYY; R=(R<0)?0:((R>255)?255:R); G=Y+GYY; G=(G<0)?0:((G>255)?255:G); B=Y+BYY; B=(B<0)?0:((B>255)?255:B); pix[index]=0xff000000|(R<<16)|(G<<8)|B; } Bitmapbm=Bitmap.createBitmap(picw,pich,false); bm.setPixels(pix,0,picw,0,0,picw,pich); //Puttheupdatedbitmapintothemainview mIV.setImageBitmap(bm); mIV.invalidate(); mBitmap=bm; pix=null; }
publicclassex04_22extendsActivity{ privateImageViewmImageView; privateButtonbtn1,btn2; privateTextViewmTextView; privateAbsoluteLayoutlayout1; privateBitmapbmp; privateintid=0; privateintdisplayWidth,displayHeight; privatefloatscaleWidth=1,scaleHeight=1; privatefinalstaticStringfilename="/data/data/ex04_22.lcs/ex04_22_2.png"; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); //取得屏幕分辨率 DisplayMetricsdm=newDisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); displayWidth=dm.widthPixels; displayHeight=dm.heightPixels-80; bmp=BitmapFactory.decodeResource(this.getResources(),R.drawable.ex04_22_1); layout1=(AbsoluteLayout)findViewById(R.id.layout1); mImageView=(ImageView)findViewById(R.id.myImageView); btn1=(Button)findViewById(R.id.myButton1); btn1.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){ small(); } }); btn2=(Button)findViewById(R.id.myButton2); btn2.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){ big(); } }); } privatevoidsmall(){ //获得Bitmap的高和宽 intbmpWidth=bmp.getWidth(); intbmpHeight=bmp.getHeight(); //设置缩小比例 doublescale=0.8; //计算出这次要缩小的比例 scaleWidth=(float)(scaleWidth*scale); scaleHeight=(float)(scaleHeight*scale); //产生resize后的Bitmap对象 Matrixmatrix=newMatrix(); matrix.postScale(scaleWidth,scaleHeight); BitmapresizeBmp=Bitmap.createBitmap(bmp,0,0,bmpWidth,bmpHeight,matrix,true); if(id==0){ layout1.removeView(mImageView); } else{ layout1.removeView((ImageView)findViewById(id)); } id++; ImageViewimageView=newImageView(this); imageView.setId(id); imageView.setImageBitmap(resizeBmp); layout1.addView(imageView); setContentView(layout1); btn2.setEnabled(true); } privatevoidbig(){ //获得Bitmap的高和宽 intbmpWidth=bmp.getWidth(); intbmpHeight=bmp.getHeight(); //设置缩小比例 doublescale=1.25; //计算出这次要缩小的比例 scaleWidth=(float)(scaleWidth*scale); scaleHeight=(float)(scaleHeight*scale); //产生resize后的Bitmap对象 Matrixmatrix=newMatrix(); matrix.postScale(scaleWidth,scaleHeight); BitmapresizeBmp=Bitmap.createBitmap(bmp,0,0,bmpWidth,bmpHeight,matrix,true); if(id==0){ layout1.removeView(mImageView); } else{ layout1.removeView((ImageView)findViewById(id)); } id++; ImageViewimageView=newImageView(this); imageView.setId(id); imageView.setImageBitmap(resizeBmp); layout1.addView(imageView); setContentView(layout1); if(scaleWidth*scale*bmpWidth>displayWidth||scaleHeight*scale*scaleHeight>displayHeight){ btn2.setEnabled(false); } } }
xml文件
<?xmlversion="1.0"encoding="utf-8"?> <AbsoluteLayout android:id="@+id/layout1" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android" > <ImageView android:id="@+id/myImageView" android:layout_width="200px" android:layout_height="150px" android:src="@drawable/ex04_22_1" android:layout_x="0px" android:layout_y="0px" > </ImageView> <Button android:id="@+id/myButton1" android:layout_width="90px" android:layout_height="60px" android:text="缩小" android:textSize="18sp" android:layout_x="20px" android:layout_y="372px" > </Button> <Button android:id="@+id/myButton2" android:layout_width="90px" android:layout_height="60px" android:text="放大" android:textSize="18sp" android:layout_x="210px" android:layout_y="372px" > </Button> </AbsoluteLayout>
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&0x00FFFFFF);//修改最高2位的值 } sourceImg=Bitmap.createBitmap(argb,sourceImg.getWidth(),sourceImg.getHeight(),Config.ARGB_8888); returnsourceImg; }
以上就是涉及到了Android图片处理的所有内容,包括android图片反转、android图片翻转、android图片旋转、实现画面淡入淡出效果、android图片的放大和缩小以及教你在谷歌Android平台中处理图片。