图片的旋转和缩放android高级
- 格式:doc
- 大小:72.50 KB
- 文档页数:3
Android中图片的处理(放大缩小,去色,转换格式,增加水印等)1package com.dzh.operateimage;2import android.graphics.Bitmap;3import android.graphics.Bitmap.Config;4import android.graphics.BitmapFactory;5import android.graphics.Canvas;6import android.graphics.ColorMatrix;7import android.graphics.ColorMatrixColorFilter;8import android.graphics.Paint;9import android.graphics.PorterDuff.Mode;10import android.graphics.PorterDuffXfermode;11import android.graphics.Rect;12import android.graphics.RectF;13import android.graphics.drawable.BitmapDrawable;14import android.graphics.drawable.Drawable;15import java.io.ByteArrayOutputStream;16import java.io.File;17import java.io.FileNotFoundException;18import java.io.FileOutputStream;19import java.io.IOException;20/**21* 处理图片的工具类.22*/23public class ImageTools {24public static final int LEFT = 0;25public static final int RIGHT = 1;26public static final int TOP = 3;27public static final int BOTTOM = 4;28/** */29/**30* 图片去色,返回灰度图片31*32* @param bmpOriginal 传入的图片33* @return 去色后的图片34*/35public static Bitmap toGrayscale(Bitmap bmpOriginal) {36int width, height;37height = bmpOriginal.getHeight();38width = bmpOriginal.getWidth();39Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); 40Canvas c = new Canvas(bmpGrayscale);41Paint paint = new Paint();42ColorMatrix cm = new ColorMatrix();43cm.setSaturation(0);44ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);45paint.setColorFilter(f);46 c.drawBitmap(bmpOriginal, 0, 0, paint);47return bmpGrayscale;48}49/** */50/**51* 去色同时加圆角52*53* @param bmpOriginal 原图54* @param pixels 圆角弧度55* @return 修改后的图片56*/57public static Bitmap toGrayscale(Bitmap bmpOriginal, int pixels) {58return toRoundCorner(toGrayscale(bmpOriginal), pixels);59}60/** */61/**62* 把图片变成圆角63*64* @param bitmap 需要修改的图片65* @param pixels 圆角的弧度66* @return 圆角图片67*/68public static Bitmap toRoundCorner(Bitmap bitmap, int pixels) {69Bitmap output = Bitmap70.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888); 71Canvas canvas = new Canvas(output);72final int color = 0xff424242;73final Paint paint = new Paint();74final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); 75final RectF rectF = new RectF(rect);76final float roundPx = pixels;77paint.setAntiAlias(true);78canvas.drawARGB(0, 0, 0, 0);79paint.setColor(color);80canvas.drawRoundRect(rectF, roundPx, roundPx, paint);81paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));82canvas.drawBitmap(bitmap, rect, rect, paint);83return output;84}85/** */86/**87* 使圆角功能支持BitampDrawable88*89* @param bitmapDrawable90* @param pixels91* @return92*/93public static BitmapDrawable toRoundCorner(BitmapDrawable bitmapDrawable, int pixels) { 94Bitmap bitmap = bitmapDrawable.getBitmap();95bitmapDrawable = new BitmapDrawable(toRoundCorner(bitmap, pixels));96return bitmapDrawable;97}98/**99* 读取路径中的图片,然后将其转化为缩放后的bitmap100*101* @param path102*/103public static void saveBefore(String path) {104BitmapFactory.Options options = new BitmapFactory.Options();105options.inJustDecodeBounds = true;106// 获取这个图片的宽和高107Bitmap bitmap = BitmapFactory.decodeFile(path, options); // 此时返回bm为空108options.inJustDecodeBounds = false;109// 计算缩放比110int be = (int)(options.outHeight / (float)200);111if (be <= 0)112be = 1;113options.inSampleSize = 2; // 图片长宽各缩小二分之一114// 重新读入图片,注意这次要把options.inJustDecodeBounds 设为false哦115bitmap = BitmapFactory.decodeFile(path, options);116int w = bitmap.getWidth();117int h = bitmap.getHeight();118System.out.println(w + " " + h);119// savePNG_After(bitmap,path);120saveJPGE_After(bitmap, path);121}122/**123* 保存图片为PNG124*125* @param bitmap126* @param name127*/128public static void savePNG_After(Bitmap bitmap, String name) {129File file = new File(name);130try {131FileOutputStream out = new FileOutputStream(file);132if (press(pressFormat.PNG, 100, out)) {133out.flush();134out.close();135}136} catch (FileNotFoundException e) {137 e.printStackTrace();138} catch (IOException e) {139 e.printStackTrace();140}141}142/**143* 保存图片为JPEG144*145* @param bitmap146* @param path147*/148public static void saveJPGE_After(Bitmap bitmap, String path) {149File file = new File(path);150try {151FileOutputStream out = new FileOutputStream(file);152if (press(pressFormat.JPEG, 100, out)) {153out.flush();154out.close();155}156} catch (FileNotFoundException e) {157 e.printStackTrace();158} catch (IOException e) {159 e.printStackTrace();160}161}162/**163* 水印164*165* @param bitmap166* @return167*/168public static Bitmap createBitmapForWatermark(Bitmap src, Bitmap watermark) { 169if (src == null) {170return null;171}172int w = src.getWidth();173int h = src.getHeight();174int ww = watermark.getWidth();175int wh = watermark.getHeight();176// create the new blank bitmap177Bitmap newb = Bitmap.createBitmap(w, h, Config.ARGB_8888);// 创建一个新的和SRC长度宽度一样的位图178Canvas cv = new Canvas(newb);179// draw src into180cv.drawBitmap(src, 0, 0, null);// 在0,0坐标开始画入src181// draw watermark into182cv.drawBitmap(watermark, w - ww + 5, h - wh + 5, null);// 在src的右下角画入水印183// save all clip184cv.save(Canvas.ALL_SAVE_FLAG);// 保存185// store186cv.restore();// 存储187return newb;188}189/**190* 图片合成191*192* @return193*/194public static Bitmap potoMix(int direction, Bitmap... bitmaps) {195if (bitmaps.length <= 0) {196return null;197}198if (bitmaps.length == 1) {199return bitmaps[0];200}201Bitmap newBitmap = bitmaps[0];202// newBitmap = createBitmapForFotoMix(bitmaps[0],bitmaps[1],direction);203for (int i = 1; i < bitmaps.length; i++) {204newBitmap = createBitmapForFotoMix(newBitmap, bitmaps[i], direction);205}206return newBitmap;207}208209private static Bitmap createBitmapForFotoMix(Bitmap first, Bitmap second, int direction) {210if (first == null) {211return null;212}213if (second == null) {214return first;215}216int fw = first.getWidth();217int fh = first.getHeight();218int sw = second.getWidth();219int sh = second.getHeight();220Bitmap newBitmap = null;221if (direction == LEFT) {222newBitmap = Bitmap.createBitmap(fw + sw, fh > sh ? fh : sh, Config.ARGB_8888); 223Canvas canvas = new Canvas(newBitmap);224canvas.drawBitmap(first, sw, 0, null);225canvas.drawBitmap(second, 0, 0, null);226} else if (direction == RIGHT) {227newBitmap = Bitmap.createBitmap(fw + sw, fh > sh ? fh : sh, Config.ARGB_8888); 228Canvas canvas = new Canvas(newBitmap);229canvas.drawBitmap(first, 0, 0, null);230canvas.drawBitmap(second, fw, 0, null);231} else if (direction == TOP) {232newBitmap = Bitmap.createBitmap(sw > fw ? sw : fw, fh + sh, Config.ARGB_8888); 233Canvas canvas = new Canvas(newBitmap);234canvas.drawBitmap(first, 0, sh, null);235canvas.drawBitmap(second, 0, 0, null);236} else if (direction == BOTTOM) {237newBitmap = Bitmap.createBitmap(sw > fw ? sw : fw, fh + sh, Config.ARGB_8888); 238Canvas canvas = new Canvas(newBitmap);239canvas.drawBitmap(first, 0, 0, null);240canvas.drawBitmap(second, 0, fh, null);241}242return newBitmap;243}244/**245* 将Bitmap转换成指定大小246* @param bitmap247* @param width248* @param height249* @return250*/251public static Bitmap createBitmapBySize(Bitmap bitmap,int width,int height)252{253return Bitmap.createScaledBitmap(bitmap, width, height, true);254}255/**256* Drawable 转Bitmap257*258* @param drawable259* @return260*/261public static Bitmap drawableToBitmapByBD(Drawable drawable) {262BitmapDrawable bitmapDrawable = (BitmapDrawable)drawable;263return bitmapDrawable.getBitmap();264}265/**266* Bitmap 转Drawable267*268* @param bitmap269* @return270*/271public static Drawable bitmapToDrawableByBD(Bitmap bitmap) { 272Drawable drawable = new BitmapDrawable(bitmap);273return drawable;274}275/**276* byte[] 转bitmap277*278* @param b279* @return280*/281public static Bitmap bytesToBimap(byte[] b) {282if (b.length != 0) {283return BitmapFactory.decodeByteArray(b, 0, b.length);284} else {285return null;286}287}288/**289* bitmap 转byte[]290*291* @param bm292* @return293*/294public static byte[] bitmapToBytes(Bitmap bm) {295ByteArrayOutputStream baos = new ByteArrayOutputStream(); press(pressFormat.PNG, 100, baos);297return baos.toByteArray();298}299}。
/** * 图片浏览、缩放、拖动、自动居中*/ public class ImageTouch extends Activity implements OnTouchListener {Matrix matrix = new Matrix();Matrix savedMatrix = new Matrix();DisplayMetrics dm;ImageView imgView;Bitmap bitmap;float minScaleR;// 最小缩放比例static final float MAX_SCALE = 4f;// 最大缩放比例static final int NONE = 0;// 初始状态static final int DRAG = 1;// 拖动static final int ZOOM = 2;// 缩放int mode = NONE;PointF prev = new PointF();PointF mid = new PointF();float dist = 1f;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);imgView = (ImageView) findViewById(R.id.imag);// 获取控件// bitmap = BitmapFactory.decodeResource(getResources(),// this.getIntent()// .getExtras().getInt("IMG"));// 获取图片资源bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image);// 获取图片资源imgView.setImageBitmap(bitmap);// 填充控件imgView.setOnTouchListener(this);// 设置触屏监听dm = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(dm);// 获取分辨率minZoom();center();imgView.setImageMatrix(matrix);}/** * 触屏监听*/public boolean onTouch(View v, MotionEvent event) {switch (event.getAction() & MotionEvent.ACTION_MASK) { // 主点按下case MotionEvent.ACTION_DOWN:savedMatrix.set(matrix);prev.set(event.getX(), event.getY());mode = DRAG;break; // 副点按下case MotionEvent.ACTION_POINTER_DOWN:dist = spacing(event); // 如果连续两点距离大于10,则判定为多点模式if (spacing(event) > 10f) {savedMatrix.set(matrix);midPoint(mid, event);mode = ZOOM;}break;case MotionEvent.ACTION_UP:case MotionEvent.ACTION_POINTER_UP:mode = NONE;break;case MotionEvent.ACTION_MOVE:if (mode == DRAG) {matrix.set(savedMatrix);matrix.postTranslate(event.getX() - prev.x, event.getY()- prev.y);} else if (mode == ZOOM) {float newDist = spacing(event);if (newDist > 10f) {matrix.set(savedMatrix);float tScale = newDist / dist;matrix.postScale(tScale, tScale, mid.x, mid.y);}}break;}imgView.setImageMatrix(matrix);CheckView();return true;}/** * 限制最大最小缩放比例,自动居中*/private void CheckView() {float p[] = new float[9];matrix.getValues(p);if (mode == ZOOM) {if (p[0] < minScaleR) {matrix.setScale(minScaleR, minScaleR);}if (p[0] > MAX_SCALE) {matrix.set(savedMatrix);}}center();}/** * 最小缩放比例,最大为100% */private void minZoom() {minScaleR = Math.min((float) dm.widthPixels / (float) bitmap.getWidth(),(float) dm.heightPixels / (float) bitmap.getHeight());if (minScaleR < 1.0) {matrix.postScale(minScaleR, minScaleR);}}private void center() {center(true, true);}/** * 横向、纵向居中*/protected void center(boolean horizontal, boolean vertical) {Matrix m = new Matrix();m.set(matrix);RectF rect = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight());m.mapRect(rect);float height = rect.height();float width = rect.width();float deltaX = 0, deltaY = 0;if (vertical) {// 图片小于屏幕大小,则居中显示。
Android多点触控技术实战,自由地对图片进行缩放和移动在Android瀑布流照片墙的效果这篇文章中,虽然这种效果很炫很酷,但其实还只能算是一个半成品,因为照片墙中所有的图片都是只能看不能点的。
因此本篇文章中,我们就来对这一功能进行完善,加入点击图片就能浏览大图的功能,并且在浏览大图的时候还可以通过多点触控的方式对图片进行缩放。
我们现在就开始动手吧,首先打开上次的PhotoWallFallsDemo项目,在里面加入一个ZoomImageView类,这个类就是用于进行大图展示和多点触控缩放的,代码如下所示:[java] view plain copypublic class ZoomImageView extends View {/*** 初始化状态常量*/public static final int STATUS_INIT = 1;/*** 图片放大状态常量*/public static final int STATUS_ZOOM_OUT = 2;/*** 图片缩小状态常量*/public static final int STATUS_ZOOM_IN = 3;/*** 图片拖动状态常量*/public static final int STATUS_MOVE = 4;/*** 用于对图片进行移动和缩放变换的矩阵*/private Matrix matrix = new Matrix();/*** 待展示的Bitmap对象*/private Bitmap sourceBitmap;/*** 记录当前操作的状态,可选值为STATUS_INIT、STATUS_ZOOM_OUT、STA TUS_ZOOM_IN和STATUS_MOVE*/private int currentStatus;/*** ZoomImageView控件的宽度*/private int width;/*** ZoomImageView控件的高度*/private int height;/*** 记录两指同时放在屏幕上时,中心点的横坐标值*/private float centerPointX;/*** 记录两指同时放在屏幕上时,中心点的纵坐标值*/private float centerPointY;/*** 记录当前图片的宽度,图片被缩放时,这个值会一起变动*/private float currentBitmapWidth;/*** 记录当前图片的高度,图片被缩放时,这个值会一起变动*/private float currentBitmapHeight;/*** 记录上次手指移动时的横坐标*/private float lastXMove = -1;/*** 记录上次手指移动时的纵坐标*/private float lastYMove = -1;/*** 记录手指在横坐标方向上的移动距离*/private float movedDistanceX;/*** 记录手指在纵坐标方向上的移动距离*/private float movedDistanceY;/*** 记录图片在矩阵上的横向偏移值*/private float totalTranslateX;/*** 记录图片在矩阵上的纵向偏移值*/private float totalTranslateY;/*** 记录图片在矩阵上的总缩放比例*/private float totalRatio;/*** 记录手指移动的距离所造成的缩放比例*/private float scaledRatio;/*** 记录图片初始化时的缩放比例*/private float initRatio;/*** 记录上次两指之间的距离*/private double lastFingerDis;/*** ZoomImageView构造函数,将当前操作状态设为STATUS_INIT。
Android应用中实现手势控制图片缩放的完全攻略这篇文章主要介绍了Android应用中实现手势控制图片缩放的完全攻略,采用了Matrix矩阵的方法,实例讲解了包括触摸点设置与各种冲突的处理等方面,相当全面,需要的朋友可以参考下一、概述现在app中,图片预览功能肯定是少不了的,用户基本已经形成条件反射,看到小图,点击看大图,看到大图两个手指开始进行放大,放大后,开始移动到指定部位~~~我相信看图的整个步骤,大家或者说用户应该不希望被打断把~~~“我擦,竟然不能放大,什么玩意,卸了~~“,"我擦,竟然不能移动,留有何用,卸了~~"。
哈~所以对于图片的预览,一来,我们要让用户爽;二来,我们作为开发者,也得知道如何实现~~~想要做到图片支持多点触控,自由的进行缩放、平移,需要了解几个知识点:Matrix , GestureDetector , ScaleGestureDetector 以及事件分发机制,ps:不会咋办,不会你懂的。
二、Matrix矩阵,看深入了都是3维矩阵的乘啊什么的,怪麻烦的~~其实这么了解下就行了:Matrix数据结构:3维矩阵;内部存储:new Float[9] ; 内部就是个一维数组,内部9个元素;可以进行setValues(float[] values)进行初始化每个元素代表的意思:{ MSCALE_X, MSKEW_X, MTRANS_X, MSKEW_Y, MSCALE_Y, MTRANS_Y, MPERSP_0, MPERSP_1, MPERSP_2 };字面上,应该能看出来哪个代表x方向缩放,哪个代表垂直方向的偏移量吧~~有不认识的3个,没事,请无视。
操作比如你想要设置matrix的偏移量为200,100你可以这么写:Matrix transMatrix = new Matrix(); float[] values = new float[] { 1.0, 0, 200, 0, 1.0, 100, 0, 0, 1.0 }; transMatrix.setValues(values);如果需要在旋转30度,放大两倍~~这么写其实怪麻烦的~~Matrix提供了一些常用的API:例如我们可以这么写:Matrix transMatrix = new Matrix(); transMatrix.postTranslate(200, 100);如何获取值:当然了,我们对一个Matrix进行了各种操作,一会postScale,一会postTranslate;那么现在如何获得当前的缩放比例:前面说setValues可以初始化,那么getValues就能拿到当前矩阵的值,拿到的是个一维数组,9个元素;再通过下标取对应值就可以。
Android图片处理工具类(圆角,压缩)工作中用到的图片处理工具类,简单写下来,以便备用!public class BitmapUtils {/*** 图像背景圆角处理* bitmap要处理的图片 roundPx 图片弯角的圆度一般是5到10之间*/public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) {// 创建与原图大小一样的bitmap文件,Config.ARGB_8888根据情况可以改用其它的Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);// 实例画布,绘制的bitmap将保存至output中Canvas canvas = new Canvas(output);final int color = 0xff424242;//写自己需要的颜色值final Paint paint = new Paint();final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());final RectF rectF = new RectF(rect);paint.setAntiAlias(true);canvas.drawARGB(0, 0, 0, 0);paint.setColor(color);canvas.drawRoundRect(rectF, roundPx, roundPx, paint);paint.setXfermode(newPorterDuffXfermode(android.graphics.PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint);bitmap.recycle();bitmap = null;return output;}/*** bitmap缩放* width要缩放的宽度 height要缩放的高度*/public static Bitmap getBitmapDeflation(Bitmap bitmap, int width, int height, boolean recycle) {if (null == bitmap) {return null;}float scaleWidth = 0f;float scaleHeight = 0f;// 获取bitmap宽高int bitmapWidth = bitmap.getWidth();int bitmapHeight = bitmap.getHeight();// 计算缩放比,图片的宽高小于指定的宽高则不缩放if (width < bitmapWidth) {scaleWidth = ((float) width) / bitmapWidth;} else {scaleWidth = 1.00f;}if (height < bitmapHeight) {scaleHeight = ((float) height) / bitmapHeight; } else {scaleHeight = 1.00f;}Matrix matrix = new Matrix();matrix.postScale(scaleWidth, scaleHeight);Bitmap newBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmapWidth, bitmapHeight, matrix, true);if (recycle && !bitmap.isRecycled()) {bitmap.recycle();}bitmap = null;return newBitmap;}/**** 方法概述:进入图片的大小与质量压缩,用于区分大小图片*/public static Bitmap getCompressedImage(String srcPath) {BitmapFactory.Options newOpts = new BitmapFactory.Options();// 开始读入图片,此时把options.inJustDecodeBounds 设回true了 newOpts.inPreferredConfig = Bitmap.Config.RGB_565;newOpts.inPurgeable = true;newOpts.inJustDecodeBounds = true;FileInputStream is = null;try {is = new FileInputStream(srcPath);} catch (FileNotFoundException e) {e.printStackTrace();}Bitmap bitmap = BitmapFactory.decodeStream(is, null, newOpts);// 此时返回bm为空newOpts.inJustDecodeBounds = false;int w = newOpts.outWidth;int h = newOpts.outHeight;// 现在主流手机比较多是800*480分辨率,所以高和宽我们设置为float hh = 130f;// 这里设置高度为800ffloat ww = 130f;// 这里设置宽度为480f// 缩放比。
Android让图⽚等⽐例缩放的三种⽅法⽅法⼀:客户端等⽐例 前提条件:服务器端需要返回原始图⽚的“宽和⾼”或者“宽⾼缩放⽐例”,客户端要显⽰的图⽚的宽或者⾼只要其⼀是固定的(例如:⾼度为200,宽度未知,或者⾼度为400宽度未知) 在这种条件下客户端可以根据服务端返回的图⽚的宽⾼或者宽⾼⽐例计算出图⽚相对于屏幕的宽或者⾼。
例如:缩放⽐例为:宽(图⽚原始宽度200px)/⾼(图⽚原始⾼度400px) = 0.5 。
客户端定义要显⽰的宽度为100px,则根据缩放⽐例⾼度应该显⽰200px(100/0.5=200)图⽚才不会变形。
android:scaleType="fitXY"⽅法⼆:服务端等⽐例 前提条件:客户端必须告诉服务端他要拿到的图⽚的宽度和⾼度。
服务端根据客户端给出的宽⾼,按照服务端能给到的最优⽅案返回⼀张按照等⽐例缩放的缩略图,给客户端显⽰ android:scaleType="fitXY"⽅法三:客户端+服务端都等⽐例缩放 ⽅法⼀和⽅法⼆都能够在⼀定程度上解决图⽚按等⽐例⽅式显⽰,但是都具有⼀定的不⾜,第⼀种⽅法的不⾜之处是:服务端返回的图⽚是原图,⽐较浪费流量和⼿机内存。
第⼆中⽅法的不⾜之处是,有时候客户端给到服务端的宽⾼,服务端并不能够按照客户端的要求返回。
因此在显⽰上会出现⼀定的拉伸或者压缩。
⽐较好的⼀种⽅法是:第⼀种⽅法+第⼆种⽅法。
⾸先服务端会给到客户端原始图⽚的宽⾼⽐例,客户端根据宽⾼⽐例,计算出最优的要显⽰到界⾯上的宽和⾼给到服务器。
服务器拿到客户端给的宽⾼之后,计算出⼀个缩略图给到客户端,之后客户端拿到这张图⽚直接显⽰。
android:scaleType="fitXY"。
图像的平移、旋转及缩放 在Android中,项⽬⽬录下的res\drawable⽤来放置该项⽬的图⽚资源。
Android中提供了Bitmap类来获取图像⽂件信息,进⾏图像的平移、旋转及缩放等操作,并可以指定格式保存图像⽂件。
1.图像绘制 在绘制图像之前,需要从项⽬⽬录下的res\drawable中获取所需的图⽚资源。
我们可以通过资源索引来获得该图像对象Bitmap。
具体⽅法如下(在项⽬⽬录下的res\drawable中放置了⼀张名为fuwa.png的图⽚): mBitmap = ((BitmapDrawable) getResources().getDrawable(R.drawable.fuwa)).getBitmap(): 其中,getResources()⽅法的作⽤是取得资源对象;getDrawable()⽅法的作⽤取得资源中的Drawable对象,参数为资源索引id;getBitmap()⽅法的作⽤是得到Bitmap对象。
获得图像资源后,可以使⽤drawBitmap()⽅法将图像显⽰到屏幕的(x,y)坐标位置上,具体⽅法如下: Canvas.drawBitmap(mBitmap, x, y, null); 此外,要获得图像的信息,可以通过mBitmap.getHight()⽅法获得该图像的⾼度,通过mBitmap.getWidth()f⽅法获得该图像的宽度。
2.图像的平移 由图像的绘制⽅法,我们知道使⽤Canvas.drawBitmap(mBitmap, x, y, null)⽅法可以将图像绘制到屏幕的(x,y)坐标位置上。
所以,要实现图像的平移,只需要改变图像绘制到屏幕上的(x,y)坐标位置即可。
3.图像的旋转 在Android中,可以使⽤Matrix来进⾏图像旋转,Matrix是⼀个3*3的矩阵,专门⽤于图像变换匹配。
Matrix没有结构体,必须被初始化,可以通过reset()或set()⽅法来实现,如下: mMatrix.reset(); 初始化之后就可以通过setRotate()⽅法来设置想要的旋转⾓度,如下: mMatrix.setRotate(); 旋转⾓度设置完毕后,可以使⽤creatBitmap()⽅法创建⼀个经过旋转处理的Bitmap对象,⽅法如下: mBitmapRotate = Bitmap.creatBitmap(mBitmap, 0, 0, mBitmapWidth, mBitmapHight, mMatrix, true); 最后,将该Bitmap对象绘制到屏幕上,便实现了图像旋转的操作。
Android 图片的翻转和旋转翻转方法:Java代码:Java代码1Resourcesres=this.getContext().getResources();2img=BitmapFactory.decodeResource(res,R.drawable.slogo);3Matrixmatrix=newMatrix();4matrix.postRotate(90);/*翻转90度*/5intwidth=img.getWidth();6intheight=img.getHeight();7r_img=Bitmap.createBitmap(img,0,0,width,height,matrix,true);8然后可以直接把r_imgdraw到画布上,例如:canvas.drawBitmap(a_img, 10, 10, p);很简单吧~~ 貌似实现很多动画效果也有很多系统函数可用Matrix是一个处理翻转、缩放等图像效果的重要类Matrix.postScale可设置缩放比例,默认为1。
画图时图片的旋转可参考下面的代码:java代码:JA V A代码9publicvoidrun(){10intx0=50;11inty0=50;12intx1=200;13inty1=200;14Canvasg;15Paintpaint=newPaint();16Bitmapimg=Bitmap.createBitmap(x1-x0,y1-y0,Bitmap.Config.ARGB_8888);17g=newCanvas(img);18paint.setColor(Color.BLUE);19g.drawRect(newRectF(0,0,x1-x0,y1-y0),paint);20paint.setColor(Color.RED);21g.drawText("N",(x1-x0)/2,10,paint);22g.drawText("W",0,(y1-y0)/2,paint);23g.drawText("S",(x1-x0)/2,y1-y0,paint);24g.drawText("E",x1-x0-10,(y1-y0)/2,paint);25while(blRun)26{27g=holder.lockCanvas();//获取画布28paint.setColor(Color.RED);29g.drawLine((x0+x1)/2,0,(x0+x1)/2,480,paint);30g.drawLine(0,(y0+y1)/2,320,(y0+y1)/2,paint);31g.save();32g.rotate(180,(x0+x1)/2,(y0+y1)/2);33g.drawBitmap(img,x0,y0,paint);34paint.setColor(Color.BLUE);35g.restore();36g.drawLine(0,0,320,480,paint);37holder.unlockCanvasAndPost(g);//解锁画布,提交画好的图像38System.out.println("run");39}4041}。
方法1:按固定比例进行缩放在开发图片浏览器等软件是,很多时候要显示图片的缩略图,而一般情况下,我们要将图片按照固定大小取缩略图,一般取缩略图的方法是使用BitmapFactory的decodeFile方法,然后通过传递进去BitmapFactory.Option类型的参数进行取缩略图,在Option中,属性值inSampleSize表示缩略图大小为原始图片大小的几分之一,即如果这个值为2,则取出的缩略图的宽和高都是原始图片的1/2,图片大小就为原始大小的1/4。
然而,如果我们想取固定大小的缩略图就比较困难了,比如,我们想将不同大小的图片去出来的缩略图高度都为200px,而且要保证图片不失真,那怎么办?我们总不能将原始图片加载到内存中再进行缩放处理吧,要知道在移动开发中,内存是相当宝贵的,而且一张100K的图片,加载完所占用的内存何止100K?经过研究,发现,Options中有个属性inJustDecodeBounds,研究了一下,终于明白是什么意思了,SDK中的E文是这么说的If set to true, the decoder will return null (no bitmap), but the out... fields will still be set, allowing the caller to query the bitmap without having to allocate the memory for its pixels.意思就是说如果该值设为true那么将不返回实际的bitmap不给其分配内存空间而里面只包括一些解码边界信息即图片大小信息,那么相应的方法也就出来了,通过设置inJustDecodeBounds为true,获取到outHeight(图片原始高度)和outWidth(图片的原始宽度),然后计算一个inSampleSize(缩放值),然后就可以取图片了,这里要注意的是,inSampleSize可能小于0,必须做判断。
Android实现图⽚反转、翻转、旋转、放⼤和缩⼩**********************************************************************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;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.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,以便在触摸事件发⽣的时候,被回调。
view plaincopy to clipboardprint?
1.package com.test.activity;
2.
3.import android.app.Activity;
4.import android.graphics.Bitmap;
5.import android.graphics.BitmapFactory;
6.import android.graphics.Matrix;
7.import android.graphics.drawable.BitmapDrawable;
8.import android.os.Bundle;
9.import youtParams;
10. import android.widget.ImageView;
11. import android.widget.LinearLayout;
12. import android.widget.ImageView.ScaleType;
13.
14. public class MainActivity extends Activity {
15. public void onCreate(Bundle icicle) {
16. super.onCreate(icicle);
17. LinearLayout linLayout = new LinearLayout(this);
18. // 加载需要操作的图片,这里是eoeAndroid的logo图片
19. Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(),
20. R.drawable.sss);
21.
22. //获取这个图片的宽和高
23. int width = bitmapOrg.getWidth();
24. int height = bitmapOrg.getHeight();
25.
26. //定义预转换成的图片的宽度和高度
27. int newWidth = 200;
28. int newHeight = 200;
29.
30. //计算缩放率,新尺寸除原始尺寸
31. float scaleWidth = ((float) newWidth) / width;
32. float scaleHeight = ((float) newHeight) / height;
33.
34. // 创建操作图片用的matrix对象
35. Matrix matrix = new Matrix();
36.
37. // 缩放图片动作
38. matrix.postScale(scaleWidth, scaleHeight);
39.
40. //旋转图片动作
41. matrix.postRotate(45);
42.
43. // 创建新的图片
44. Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0,
45. width, height, matrix, true);
46.
47. //将上面创建的Bitmap转换成Drawable对象,使得其可以使用在
ImageView, ImageButton中
48. BitmapDrawable bmd = new BitmapDrawable(resizedBitmap);
49.
50. //创建一个ImageView
51. ImageView imageView = new ImageView(this);
52.
53. // 设置ImageView的图片为上面转换的图片
54. imageView.setImageDrawable(bmd);
55.
56. //将图片居中显示
57. imageView.setScaleType(ScaleType.CENTER);
58.
59. //将ImageView添加到布局模板中
60. linLayout.addView(imageView,
61. new youtParams(
62. LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT
63. )
64. );
65.
66. // 设置为本activity的模板
67. setContentView(linLayout);
68. }
69. }。