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平台中处理图片。