在Android中进行图像旋转需要使用Matrix,它包含了一个3*3的矩阵,专门用于进行图像变换匹配。Matrix,中文里叫矩阵,高等数学里有介绍,在图像处理方面,主要是用于平面的缩放、平移、旋转等操作。Matrix没有机构体,它必须初始化,然后通过reset方法和set方法来实现。
首先介绍一下矩阵运算。加法和减法就不用说了,太简单了,对应位相加就好。图像处理,主要用到的是乘法。下面是一个乘法的公式:
在Android里面,Matrix由9个float值构成,是一个3*3的矩阵。如下图。
没专业工具,画的挺难看。解释一下,上面的sinX和cosX,表示旋转角度的cos值和sin值,注意,旋转角度是按顺时针方向计算的。translateX和translateY表示x和y的平移量。scale是缩放的比例,1是不变,2是表示缩放1/2,这样子。
Matrix的操作,总共分为translate(平移),rotate(旋转),scale(缩放)和skew(倾斜)四种,每一种变换在Android的API里都提供了set,post和pre三种操作方式,除了translate,其他三种操作都可以指定中心点。set是直接设置Matrix的值,每次set一次,整个Matrix的数组都会变掉。
我们现在通过setRotate设置旋转角度,用creatBitmap创建一个经过旋转等处理的Bitmap对象,然后将Bitmap绘制到屏幕之上,于是就实现了旋转操作。
下面使用一个示例来说明Matix的使用以及旋转的方式及运行效果。
package com.sid.rotate;
import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
public class RotateActivity extends Activity {
private GameView mGameView = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mGameView = new GameView(this);
setContentView(mGameView);
}
public boolean onKeyUp(int keyCode, KeyEvent event) {
super.onKeyUp(keyCode, event);
return true;
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (mGameView == null) {
return false;
}
if (keyCode == KeyEvent.KEYCODE_BACK) {
this.finish();
return true;
}
return mGameView.onKeyDown(keyCode, event);
}
}
package com.sid.rotate;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.view.KeyEvent;
import android.view.View;
public class GameView extends View implements Runnable{
//声明Bitmap对象
Bitmap mBitQQ = null;
int BitQQwidth = 0;
int BitQQheight = 0;
float Angle = 0.0f;
//构建Matrix对象
Matrix mMatrix = new Matrix();
public GameView(Context context) {
super(context);
//装载资源
mBitQQ = ((BitmapDrawable)getResources().getDrawable(R.drawable.xh)).getBitmap();
//得到图片的高度和宽度
BitQQwidth = mBitQQ.getWidth();
BitQQheight = mBitQQ.getHeight();
//开启线程
new Thread(this).start();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//重置mMatrix对象
mMatrix.reset();
//设置旋转
mMatrix.setRotate(Angle);
//按mMatrix的旋转构建一个新的Bitmap 这里给大家说一下这几个参数 搞的我比较郁闷了
/*第一个参数不说了
* 第二个 帮助文档翻译过来 是第一个像素源的 X坐标 我不知道是咋回事,如果哪位大哥知道还请给小弟留言
* 这里要提醒大家一下 就是 第二个参数 和第三个参数 0,0 这2个参数 必须 我写一个式子吧
* 0+mBitQQ.getWidt() <= Bitmap.width
* 0+mBitQQ.getHeight() <= Bitmap.height 大家仔细看看 所以这2个参数我觉得只能写0虽然我不知道
* 这2个参数到底用来决定什么。 如果大家谁知道 留言啊 谢谢。 如果不遵守那个式子就会有异常 大家可以看一看此方法的源码 或者自己试试
* 第三个参数和第二个表达意思一样
* 第四个参数可以理解为宽度
* 第五个参数可以理解为高度
* 第六个参数矩阵对象
* 第七个参数 我也不知道是干嘛的 但是 设置为true之后,图片的旋转的过程中 不会失真,就是字会看不清楚。
* 大家可以下载源码试试 这个参数 建议还是设置为true吧。
* */
Bitmap mBitQQ2 = Bitmap.createBitmap(mBitQQ, 0, 0, BitQQwidth, BitQQheight, mMatrix, true);
//绘制旋转后的图片
GameView.drawImage(canvas, mBitQQ2, (320-BitQQwidth)/2, 10);
mBitQQ2 = null;
}
//按键按下事件
public boolean onKeyDown(int keyCode, KeyEvent event){
//左方向键
if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
Angle--;
}else if(keyCode == KeyEvent.KEYCODE_DPAD_RIGHT){
Angle++;
}
return true;
}
//按键弹起事件
public boolean onKeyUp(int keyCode, KeyEvent event){
return true;
}
public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event){
return true;
}
//线程处理
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
Thread.sleep(100);
} catch (Exception e) {
Thread.currentThread().interrupt();
}
postInvalidate();
}
}
/**
* 绘制一个Bitmap
* @param canvas 画布
* @param bitmap 图片
* @param x 屏幕上的x坐标
* @param y 屏幕上的y坐标
* */
public static void drawImage(Canvas canvas, Bitmap bitmap, int x ,int y){
//绘制图像
canvas.drawBitmap(bitmap, x, y, null);
}
}
分享到:
相关推荐
本人的博客:android图片处理:让图片一直匀速旋转的demo
本文实例讲述了Android开发之图片旋转功能实现方法。分享给大家供大家参考,具体如下: 在Android中进行图像旋转需要使用Matrix,它包含了一个3*3的矩阵,专门用于进行图像变换匹配。Matrix ,中文里叫矩阵,高等...
android手势处理图片平移、缩放和旋转 图片出界判断 处理后新图片的创建
本项目是一个图片处理的综合例子源码,实现了图片的旋转,缩放,加盖水印,透明,倾斜,扭曲用到的图片是使用httpclient 实现在线图片的下载展示,并实现图片处理。如果,网络图片不存在了,请在代码中修改图片路径...
android图片处理_让图片一直匀速旋转的demo.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
android图片处理,缩放、压缩、剪切、水印、黑白、旋转等10多种特效
本项目是一个图片处理的综合例子源码,实现了图片的旋转,缩放,加盖水印,透明,倾斜,扭曲用到的图片是使用httpclient 实现在线图片的下载展示,并实现图片处理。如果,网络图片不存在了,请在代码中修改图片路径...
Android图片效果: "图片缩放", "图片圆角", "图片倒影", "旋转图片", "图片反转", "图片色调饱和度、色相、亮度处理", "涂鸦,水印", "图片上写文字", "怀旧效果", "模糊效果" ,"柔化效果(高斯模糊)", "浮雕效果...
根据github上demo修改的,支持手势滑动,多点触控放大缩小,支持viewpager中放大所有,支持网络下载图片...完整并且完美的例子,很好用的...
android图片旋转、淡入淡出、缩放效果、移动效果示例,先来看下截图的运行效果,单击对应的按钮,即可看到效果,淡入淡出之类的,图片旋转之类的。 图片旋转的代码如下: rotateAnimation.setDuration(5000); ...
2. android 图像处理系列之二--图片旋转、缩放、反转........................................................................................ 3 3. android 图像处理系列之三--图片色调饱和度、色相、...
OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,网络上一些小伙伴...需opencv官网下载OpenCV-android-sdk将其中的sdk覆盖工程中的sdk,由于sdk文件太大,这里就没有上传,是个空目录。
源码参考,欢迎下载
让图片一直匀速旋,这篇文章主要介绍了android图片处理之让图片一直匀速旋转的相关资料,感兴趣的小伙伴们可以参考一下
"图片缩放", "图片圆角", "图片倒影", "旋转图片", "图片反转", "图片色调饱和度、色相、亮度处理", "涂鸦,水印", "图片上写文字", "怀旧效果","模糊效果" ,"柔化效果(高斯模糊)", "浮雕效果", "锐化效果", "底片...
Android图像操作一例,使用Matrix.postRotate方法旋转图片,这些的图片格式是BMP,其它格式可能也能用吧,没测试,旋转BMP图片的效果如截图所示,用户单击向左或向右按钮后,图片旋转90度,旋转角度根据自己需要...
本资源为Android项目中的常用图片特效处理工具,旨在帮助开发者轻松实现各种图片效果,提升应用的用户体验。该资源包含了一系列预制的图片处理功能,如滤镜、裁剪、旋转、缩放等,以及高级特效如模糊、锐化、边缘...
Android应用中,图片随手势的拖拽、缩放、旋转在很多场景中都会用到,今天我们要做的就是在ImageView的基础上实现一个可以拖拽、缩放、转转的TouchView。
Android 使用libyuv对Android yuv数据进行缩放,旋转,镜像,裁剪等操作