安卓中采用的是png格式,采用的是ARGB,一个像素占4个字节;
图片缩放步骤:获取图像的分辨率,手机的分辨率,计算缩放比;
//------------------缩放图片显示-----------------
public void suofangImage(){
///
WindowManager mage= (WindowManager) getSystemService(WINDOW_SERVICE);
//过时的
// int height = mage.getDefaultDisplay().getHeight();//获取高
//int width=mage.getDefaultDisplay().getWidth();
//新的
Point point=new Point();
mage.getDefaultDisplay().getSize(point);
int width=point.x;
int height=point.y;
ImageView imgaV=findViewById(R.id.imagev);
//获取图片的宽高
//创建一个位图工厂配置参数
BitmapFactory.Options options=new BitmapFactory.Options();
//解码器不去真正的解析位图,但是还能获取图片的款和高
options.inJustDecodeBounds=true;
BitmapFactory.decodeFile("/mnt/sdcard/dog.png");
//获取图片的宽和高
int iH=options.outHeight;
int iW=options.outWidth;
//计算缩放比
int scale=1;
int scaleX=iW/width;
int scaleY=iH/height;
if(scaleX>=scaleY && scaleX>scale){
scale=scaleX;
}else if(scaleXscale){
scale=scaleY;
}
//按照缩放比显示
options.inSampleSize=scale;
//解析位图
options.inJustDecodeBounds=false;
Bitmap bitmap=BitmapFactory.decodeFile("/mnt/sdcard/dog.png",options);
//显示图片
imgaV.setImageBitmap(bitmap);
}
--------------绘制图片、修改图片--------
//修改操作图片
public void changeImage(){
ImageView imgaV=findViewById(R.id.imagev);
Bitmap scrBitmap=BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher_background);//直接把图拖进工程中哪图片
//创建原图的副本
Bitmap copYBit= Bitmap.createBitmap(scrBitmap.getWidth(),scrBitmap.getHeight(),scrBitmap.getConfig());//创建一个模板,相当于一张白纸
//制作一个画笔
Paint paint=new Paint();
//制作画布
Canvas canvas=new Canvas(copYBit);
//开始画图
//画了一个和原始图一样的图片
//图形处理的api***********
//旋转
Matrix matrix=new Matrix();
// matrix.setRotate(20,scrBitmap.getWidth()/2,scrBitmap.getHeight()/2);//第一个是旋转角度,后面两个参数是坐标的想,y轴
//缩放
//matrix.setScale(0.5f,0.5f);
//平移
matrix.setTranslate(20,30);
//镜面-(左右翻转)---就是缩放和平移的结合
matrix.setScale(-1.0f,1.0f);
matrix.postTranslate(scrBitmap.getWidth()/2,0);//postTranslate是在上一次的基础上再次翻转,setTranslate的操作每次都是最新的,会覆盖上次的操作
//倒影-(上下翻转)---就是缩放和平移的结合
matrix.setScale(1.0f,-1.0f);
matrix.postTranslate(0,scrBitmap.getHeight()/2);
canvas.drawBitmap(scrBitmap,new Matrix(),paint); //第二个参数是矩阵
//操作画出来的图片
copYBit.setPixel(20,30, Color.RED);//在20,30这个坐标颜色修改成红色
imgaV.setImageBitmap(copYBit);
}
-------------小画板-------------
并保存到sd卡
public void changeImage(){
imgaV = findViewById(R.id.imagev);
Bitmap scrBitmap=BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher_background);//直接把图拖进工程中哪图片
//创建原图的副本
final Bitmap copYBit= Bitmap.createBitmap(scrBitmap.getWidth(),scrBitmap.getHeight(),scrBitmap.getConfig());//创建一个模板,相当于一张白纸
//制作一个画笔
final Paint paint=new Paint();
paint.setColor(Color.RED);//画笔颜色改成红色
paint.setStrokeWidth(20);//画笔笔尖宽度
//制作画布
final Canvas canvas=new Canvas(copYBit);
//开始画图
//画了一个和原始图一样的图片
//图形处理的api***********
//旋转
Matrix matrix=new Matrix();
// matrix.setRotate(20,scrBitmap.getWidth()/2,scrBitmap.getHeight()/2);//第一个是旋转角度,后面两个参数是坐标的想,y轴
//缩放
//matrix.setScale(0.5f,0.5f);
//平移
matrix.setTranslate(20,30);
//镜面-(左右翻转)---就是缩放和平移的结合
matrix.setScale(-1.0f,1.0f);
matrix.postTranslate(scrBitmap.getWidth()/2,0);//postTranslate是在上一次的基础上再次翻转,setTranslate的操作每次都是最新的,会覆盖上次的操作
//倒影-(上下翻转)---就是缩放和平移的结合
matrix.setScale(1.0f,-1.0f);
matrix.postTranslate(0,scrBitmap.getHeight()/2);
canvas.drawBitmap(scrBitmap,new Matrix(),paint); //这是画了一张图,第二个参数是矩阵
canvas.drawLine(20,30,40,50,paint);//画一条线,开始点和结束点
//操作画出来的图片
copYBit.setPixel(20,30, Color.RED);//在20,30这个坐标颜色修改成红色
//吧图片保存到手机sd卡************
File file=new File(Environment.getExternalStorageDirectory().getPath(), SystemClock.uptimeMillis()+"png");
FileOutputStream fos= null;
try {
fos = new FileOutputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
/*
* 第一个参数是保存图片的格式
* 第二个图片是保存图片的质量,0-100,0最小,100最大
*
* SystemClock.uptimeMillis()是当前手机的开机时间
*
* */
copYBit.compress(Bitmap.CompressFormat.PNG,100,fos);
//发送一条广播欺骗系统图库的应用
Intent intent=new Intent();
intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));
sendBroadcast(intent);
//给iamgeview设置触摸事件
imgaV.setOnTouchListener(new View.OnTouchListener() {
private int startY;
private int startX;
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
int action = motionEvent.getAction();//获取当前事件的类型
switch (action){
case MotionEvent.ACTION_DOWN://按下
//获取开始位置
startX = (int) motionEvent.getX();
startY = (int) motionEvent.getY();
break;
case MotionEvent.ACTION_MOVE://移动
//获取结束的位置
int endX= (int) motionEvent.getX();
int endY= (int) motionEvent.getY();
canvas.drawLine(startX, startY,endX,endY,paint);
//再次显示到imagev上,
imgaV.setImageBitmap(copYBit);
//更新一下开始的坐标
startX=endX;
startY=endY;
break;
case MotionEvent.ACTION_UP://抬起
break;
case MotionEvent.ACTION_CANCEL://取消
break;
}
return true;//true监听器处理完事件了
}
});
}