当前位置: 移动技术网 > IT编程>移动开发>Android > Android实现图片反转、翻转、旋转、放大和缩小

Android实现图片反转、翻转、旋转、放大和缩小

2019年07月24日  | 移动技术网IT编程  | 我要评论

王成快,安宁事业单位招聘,陈德容 双镯

**********************************************************************

android 实现图片的翻转

**********************************************************************

resources res = this.getcontext().getresources();
 img = bitmapfactory.decoderesource(res, r.drawable.aa);
 matrix matrix = new matrix();
 matrix.postrotate(180); /*翻转180度*/
 int width = img.getwidth();
 int height = img.getheight();
 img_a = bitmap.createbitmap(img, 0, 0, width, height, matrix, true);

然后可以直接把img_a draw到画布上,canvas.drawbitmap(img_a, 10, 10, p);

matrix 是一个处理翻转、缩放等图像效果的重要类,matrix.postscale 可设置缩放比例,默认为1

**********************************************************************
android 实现图片的旋转

**********************************************************************

public class ex04_22 extends activity{
 
private imageview mimageview;
private button btn1,btn2;
private textview mtextview;
private absolutelayout layout1;
private int scaletimes=1,scaleangle=1;
 @override
 public void oncreate(bundle savedinstancestate) {
 super.oncreate(savedinstancestate);
 setcontentview(r.layout.main);
 mimageview=(imageview)findviewbyid(r.id.myimageview);
 final bitmap bmp=bitmapfactory.decoderesource(this.getresources(),r.drawable.ex04_22_1);
 final int widthorig=bmp.getwidth();
 final int heightorig=bmp.getheight();
 mimageview.setimagebitmap(bmp);
 btn1=(button)findviewbyid(r.id.mybutton1);
 btn1.setonclicklistener(new onclicklistener(){
 public void onclick(view v){
 scaleangle--;
 if(scaleangle<-60){
 scaleangle=-60;
 }
 int newwidth=widthorig*scaletimes;
 int newheight=heightorig*scaletimes;
 float scalewidth=((float)newwidth)/widthorig;
 float scaleheight=((float)newheight)/heightorig;
 matrix matrix=new matrix();
 matrix.postscale(scalewidth, scaleheight);
 matrix.setrotate(5*scaleangle);
 bitmap resizebitmap=bitmap.createbitmap(bmp, 0, 0, widthorig, heightorig, matrix, true);
 bitmapdrawable mynewbitmapdrawable=new bitmapdrawable(resizebitmap);
 mimageview.setimagedrawable(mynewbitmapdrawable);
 }
 });
 btn2=(button)findviewbyid(r.id.mybutton2);
 btn2.setonclicklistener(new onclicklistener(){
 public void onclick(view v){
 scaleangle++;
 if(scaleangle>60){
 scaleangle=60;
 }
 int newwidth=widthorig*scaletimes;
 int newheight=heightorig*scaletimes;
 float scalewidth=((float)newwidth)/widthorig;
 float scaleheight=((float)newheight)/heightorig;
 matrix matrix=new matrix();
 matrix.postscale(scalewidth, scaleheight);
 matrix.setrotate(5*scaleangle);
 bitmap resizebitmap=bitmap.createbitmap(bmp, 0, 0, widthorig, heightorig, matrix, true);
 bitmapdrawable mynewbitmapdrawable=new bitmapdrawable(resizebitmap);
 mimageview.setimagedrawable(mynewbitmapdrawable);
 }
 });
 }

**********************************************************************

实现画面淡入淡出效果可以用 :setalpha(alpha);
alpha从255,逐渐递减!

**********************************************************************

如何实现屏幕的滚动效果,这里有两个关键点,一个是实现ongesturelistener,以便在触摸事件发生的时候,被回调。包括按下,滚动等等,按照api文档,需要分两步来实现检测手势行为。

1)创建gesturedetector实例

2) 在ontouchevent()方法中调用gesturedetector的ontouchevent()方法。

另一个关键点是自己实现一个简单的view,来绘制图片。

代码如下所示。由于,我们不需要使用layout定义,所以不需要提供xml文件。
直接在程序里面setcontentview()即可。

package com.j2medev;
 
import android.app.activity;
import android.content.context;
import android.content.res.resources;
import android.graphics.bitmap;
import android.graphics.bitmapfactory;
import android.graphics.canvas;
import android.graphics.paint;
import android.os.bundle;
import android.view.gesturedetector;
import android.view.motionevent;
import android.view.view;
import android.view.viewgroup;
import android.view.gesturedetector.ongesturelistener;
 
public class horizontalscroll extends activity implements ongesturelistener {
private static final int x_max = 800;
private static final int y_max = 600;
private int scrollx = 0;
private int scrolly = 0;
 
myview main;
bitmap bmp;
bitmap adapt;
resources res;
paint paint;
gesturedetector gesturescanner;
 
@override
public void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
 
gesturescanner = new gesturedetector(this);
paint = new paint();
 
res = getresources();
bmp = bitmapfactory.decoderesource(res, r.drawable.arc);
adapt = bitmap.createbitmap(bmp);
 
main = new myview(this);
setcontentview(main, new viewgroup.layoutparams(800, 600));
}
 
@override
public boolean ontouchevent(motionevent me) {
return gesturescanner.ontouchevent(me);
}
 
public boolean onscroll(motionevent e1, motionevent e2, float distancex,
 float distancey) {
main.handlescroll(distancex, distancey);
return true;
}
 
public boolean ondown(motionevent e) {
return true;
}
 
public boolean onfling(motionevent e1, motionevent e2, float velocityx,
 float velocityy) {
return true;
}
 
public void onlongpress(motionevent e) {
}
 
public void onshowpress(motionevent e) {
}
 
public boolean onsingletapup(motionevent e) {
return true;
}
 
// //////////////////
// /////////////////
// ////////////////
 
class myview extends view {
public myview(context context) {
 super(context);
}
 
@override
protected void ondraw(canvas canvas) {
 canvas.drawbitmap(adapt, -scrollx, -scrolly, paint);
}
 
public void handlescroll(float distx, float disty) {
 // x-axis ////////////////////////////////
 
 if (distx > 6.0) {
 if (scrollx < 460) {
 scrollx += 15;
 }
 } else if (distx < -6.0) {
 if (scrollx >= 15) {
 scrollx -= 15;
 }
 }
 // //////////////////////////////////////////
 
 // y-axis //////////////////////////////////
 if (disty > 6.0) {
 if (scrolly < 100) {
 scrolly += 15;
 }
 } else if (disty < -6.0) {
 if (scrolly >= 15) {
 scrolly -= 15;
 }
 }
 // //////////////////////////////////////////
 //
 // if ((scrollx <= 480) && (scrolly <= 120)) {
 // adapt = bitmap.createbitmap(bmp, scrollx, scrolly, 320, 480);
 // invalidate();
 // }
 invalidate();
}
}
}

**********************************************************************

教你在谷歌android平台中处理图片

**********************************************************************

操作图像像素

现在你可以对单独的像素进行处理了。通过使用android.graphics.bitmap api中的getpixels,可以加载像素到一个整数数组中。

在本文例子中,你将按照一定规则对每一个像素实现着色。经过这个处理后,所有的像素将被转化为一个范围在0到255的字节码。

android.graphics.bitmap api中的setpixels则用来加载这个整数数组到一个图像中。

最后一步是通过imageview变量miv来更新屏幕。以下是实现这个染色过程的代码片段。

private void tintthepicture(int deg) {
 int[] pix = new int[picw * pich];
 mbitmap.getpixels(pix, 0, picw, 0, 0, picw, pich);
 
 int ry, gy, by, ryy, gyy, byy, r, g, b, y;
 double angle = (3.14159d * (double)deg) / 180.0d;
 int s = (int)(256.0d * math.sin(angle));
 int c = (int)(256.0d * math.cos(angle));
 
 for (int y = 0; y < pich; y++)
 for (int x = 0; x < picw; x++)
 {
 int index = y * picw + x;
 int r = (pix[index] >> 16) & 0xff;
 int g = (pix[index] >> 8) & 0xff;
 int b = 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;
 }
 
 bitmap bm = bitmap.createbitmap(picw, pich, false);
 bm.setpixels(pix, 0, picw, 0, 0, picw, pich);
 
 // put the updated bitmap into the main view
 miv.setimagebitmap(bm);
 miv.invalidate();
 
 mbitmap = bm;
 pix = null;
 }

**********************************************************************

android 图片的放大和缩小

**********************************************************************

public class ex04_22 extends activity{
private imageview mimageview;
private button btn1,btn2;
private textview mtextview;
private absolutelayout layout1;
private bitmap bmp;
private int id=0;
private int displaywidth,displayheight;
private float scalewidth=1,scaleheight=1;
private final static string filename="/data/data/ex04_22.lcs/ex04_22_2.png";
@override
public void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.main);
//取得屏幕分辨率
displaymetrics dm=new displaymetrics();
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(new onclicklistener(){
public void onclick(view v){
small();
}
});
btn2=(button)findviewbyid(r.id.mybutton2);
btn2.setonclicklistener(new onclicklistener(){
public void onclick(view v){
big();
}
});
}
private void small(){
//获得bitmap的高和宽
int bmpwidth=bmp.getwidth();
int bmpheight=bmp.getheight();
//设置缩小比例
double scale=0.8;
//计算出这次要缩小的比例
scalewidth=(float)(scalewidth*scale);
scaleheight=(float)(scaleheight*scale);
//产生resize后的bitmap对象
matrix matrix=new matrix();
matrix.postscale(scalewidth, scaleheight);
bitmap resizebmp=bitmap.createbitmap(bmp, 0, 0, bmpwidth, bmpheight, matrix, true);
if(id==0){
layout1.removeview(mimageview);
}
else{
layout1.removeview((imageview)findviewbyid(id));
}
id++;
imageview imageview=new imageview(this);
imageview.setid(id);
imageview.setimagebitmap(resizebmp);
layout1.addview(imageview);
setcontentview(layout1);
btn2.setenabled(true);
}
private void big(){
//获得bitmap的高和宽
int bmpwidth=bmp.getwidth();
int bmpheight=bmp.getheight();
//设置缩小比例
double scale=1.25;
//计算出这次要缩小的比例
scalewidth=(float)(scalewidth*scale);
scaleheight=(float)(scaleheight*scale);
//产生resize后的bitmap对象
matrix matrix=new matrix();
matrix.postscale(scalewidth, scaleheight);
bitmap resizebmp=bitmap.createbitmap(bmp, 0, 0, bmpwidth, bmpheight, matrix, true);
if(id==0){
layout1.removeview(mimageview);
}
else{
layout1.removeview((imageview)findviewbyid(id));
}
id++;
imageview imageview=new imageview(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文件

<?xml version="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>

*********************************************************************

android 图片透明度处理代码

*********************************************************************

public static bitmap setalpha(bitmap sourceimg, int number) {
 
  int[] argb = new int[sourceimg.getwidth() * sourceimg.getheight()];
 
  sourceimg.getpixels(argb, 0, sourceimg.getwidth(), 0, 0,sourceimg.getwidth(), sourceimg.getheight());// 获得图片的argb值
 
  number = number * 255 / 100;
 
  for (int i = 0; i < argb.length; i++) {
 
  argb = (number << 24) | (argb & 0x00ffffff);// 修改最高2位的值
 
  }
 
  sourceimg = bitmap.createbitmap(argb, sourceimg.getwidth(), sourceimg.getheight(), config.argb_8888);
 
  return sourceimg;
 
}

以上就是涉及到了android图片处理的所有内容,包括android图片反转、android 图片翻转、android 图片旋转、实现画面淡入淡出效果、android 图片的放大和缩小以及教你在谷歌android平台中处理图片。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网