案例加载一张大图
在android中当加载的图片过大(分辨率高)时导致图片无法正常查看甚至会报oom异常,所以当加载一张大图时需要设置其缩放的比例系数

package com.example.loadBigImage;import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.graphics.Point;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;public class MainActivity extends Activity {private ImageView iv;private int height;private int width;@SuppressWarnings("deprecation")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//用来显示小狗的照片iv = (ImageView) findViewById(R.id.iv);//【1】获取手机的分辨率  windowmanager  smsManager telephoneManagerWindowManager wm= (WindowManager) getSystemService(WINDOW_SERVICE);height = wm.getDefaultDisplay().getHeight();width = wm.getDefaultDisplay().getWidth();System.out.println("width:"+width+"-----height:"+height);// Point point=new Point();// wm.getDefaultDisplay().getSize(point);//    int width=point.x;//   int height=point.y;//  System.out.println("width:"+width+"-----height:"+height);}//加载一张大图片public void click(View v){//创建一个位图工厂的配置参数BitmapFactory.Options options=new Options();//解码器不去真正地解析位图  只获取图片的宽和高信息options.inJustDecodeBounds=true;//加载图片内容   申请内存超过16M(取决于设备dvm分配的内存大小,无法改变)会报内存溢出错误  oom  out of memory BitmapFactory.decodeFile("/mnt/sdcard/dog.jpg",options);//【2】获取图片的宽和高信息int imgwidth=options.outWidth;int imgheight=options.outHeight;//【3】计算缩放比int scale=1;int scaleX=imgwidth/width;int scaleY=imgheight/height;if(scaleX>=scaleY&&scaleX>scale){scale=scaleX;}else if(scaleY>=scaleX&&scaleY>scale){scale=scaleY;}System.out.println("缩放比:"+scale);//[4]按照缩放比进行显示   设置缩放参数options.inSampleSize=scale;//理解为原图的采样比,按照这个标准对原图采样将减少内存使用。//[5]按照缩放比 进行解析位图options.inJustDecodeBounds=false;Bitmap bitmap=BitmapFactory.decodeFile("/mnt/sdcard/dog.jpg",options);//[6]把bitmap显示到iv上iv.setImageBitmap(bitmap);}
}

1掌握WindowManager的使用
2了解BitmapFactory的使用
3理解缩放比例系数

创建一个原图的副本
比如我们在美图秀秀中对一张图片进行操作后,保存时提醒你保存为副本或是覆盖原图,此时就应用到了创建原图副本进行操作的逻辑。

package com.example.copybitmap;import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageView;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//显示原图ImageView iv_src=(ImageView) findViewById(R.id.iv_src);//显示副本ImageView iv_copy=(ImageView) findViewById(R.id.iv_copy);//[1]先把dog.png图片转换成bitmap 显示到iv_src上    getResource()  获取当前工程中的资源Bitmap srcBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.dog);//[1.1]操作图片//srcBitmap.setPixel(50, 50, Color.RED);//修改哪一点坐标的颜色//TODO   iv_src.setImageBitmap(srcBitmap);//[2]创建原图的副本//[2.1]创建一个模板  相当于创建了一个和原图一样的空白的白纸Bitmap copybitmap=Bitmap.createBitmap(srcBitmap.getWidth(),srcBitmap.getHeight(),srcBitmap.getConfig());//[2.2]想作画需要一个画笔Paint paint=new Paint();//[2.3]创建一个画布  把白纸铺到画布上Canvas canvas=new Canvas(copybitmap);//[2.4]开始作画canvas.drawBitmap(srcBitmap, new Matrix(), paint);//[2.5]操作画出来的小狗照片for (int i = 0; i < 20; i++) {copybitmap.setPixel(100+i, 50, Color.RED);}//[3]把copybitmap显示到iv_copy上iv_copy.setImageBitmap(copybitmap);}
}


图片处理常用api
旋转,缩放,平移,镜面,倒影等。

//[2]创建原图的副本//[2.1]创建一个模板  相当于创建了一个和原图一样的空白的白纸Bitmap copybitmap=Bitmap.createBitmap(srcBitmap.getWidth(),srcBitmap.getHeight(),srcBitmap.getConfig());//[2.2]想作画需要一个画笔Paint paint=new Paint();//[2.3]创建一个画布  把白纸铺到画布上    Canvas canvas=new Canvas(copybitmap);//[2.4]开始作画Matrix matrix=new Matrix();//[2.5]对图片进行旋转   设置旋转角度  以及旋转中心//matrix.setRotate(20, srcBitmap.getWidth()/2, srcBitmap.getHeight()/2);//[2.6]对图片进行缩放// matrix.setScale(0.5f, 0.5f);//[2.7]对图片进行平移//matrix.setTranslate(30f, 0);//[2.8]镜面效果   两个方法一起用//matrix.setScale(-1.0f, 1);//post是在上一次修改基础上再次进行修改       set每次操作都是最新的   会覆盖上次的操作//matrix.postTranslate(srcBitmap.getWidth(), 0);//翻转后再移动回原位置//[2.9]倒影效果matrix.setScale(1, -1);//post是在上一次修改基础上再次进行修改       set每次操作都是最新的   会覆盖上次的操作matrix.postTranslate(0, srcBitmap.getHeight());canvas.drawBitmap(srcBitmap,matrix, paint);//[3]把copybitmap显示到iv_copy上iv_copy.setImageBitmap(copybitmap);

镜面效果示意图

画画板小应用(画图并将图片保存到sd卡)

public class MainActivity extends Activity {private Canvas canvas;private ImageView iv;private Bitmap srcBitmap;private Paint paint;private Bitmap copyBitmap;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//用来显示我们画的内容iv = (ImageView) findViewById(R.id.iv);srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bg);//[2]获取原图的副本  相当于是一张空白的白纸copyBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), srcBitmap.getConfig());//创建一个画笔paint = new Paint();canvas = new Canvas(copyBitmap);//开始作画canvas.drawBitmap(srcBitmap, new Matrix(), paint);//   canvas.drawLine(20, 30, 100, 100, paint);iv.setImageBitmap(copyBitmap);//[3]给iv设置一个触摸事件iv.setOnTouchListener(new OnTouchListener() {private int startX;private int startY;@Overridepublic boolean onTouch(View v, MotionEvent event) {int action=event.getAction();switch (action) {case MotionEvent.ACTION_DOWN://按下//获取开始划线的位置System.out.println("触摸view");startX = (int) event.getX();startY = (int) event.getY();break;case MotionEvent.ACTION_MOVE://移动//获取结束位置int stopX=(int) event.getX();int stopY=(int) event.getY();//不停地划线canvas.drawLine(startX, startY, stopX, stopY, paint);//再次显示在iv上iv.setImageBitmap(copyBitmap);//更新一下开始坐标和结束坐标startX=stopX;startY=stopY;break;case MotionEvent.ACTION_UP://抬起break;}//True if the listener has consumed the event, false otherwise.return true;//true 监听器处理完当前事件了  可以进行之后的监听}});}//点击按钮改变画笔的颜色public void click1(View v){paint.setColor(Color.RED);}//加粗public void click2(View v){paint.setStrokeWidth(5);}//保存public void click3(View v){/*** format 保存图片的格式* quality 质量* SystemClock.uptimeMillis()   当前手机的开机时间*/try {//保存到sdcard  需要开启sdcard权限File file=new File(Environment.getExternalStorageDirectory().getPath(),SystemClock.uptimeMillis()+".png");FileOutputStream fos=new FileOutputStream(file);copyBitmap.compress(CompressFormat.PNG, 100, fos);//发送一条广播   欺骗系统图库的应用Intent intent=new Intent();//设置actionintent.setAction(Intent.ACTION_MEDIA_MOUNTED);intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));//发送一条广播sendBroadcast(intent);} catch (Exception e) {e.printStackTrace();}}
}



撕衣服小案例
原理:两张图片叠放再一起,触摸上面那张穿衣服图片的地方变透明,下方没穿衣服的图片就显示出来。

public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//用来显示操作后的图片final ImageView iv=(ImageView) findViewById(R.id.iv);//[1]获取要操作的图片  原图  穿衣服的Bitmap srcBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.m2);//[2]创建一个副本   相当于一个和原图大小一样的白纸final Bitmap alterBitmap=Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), srcBitmap.getConfig());//创建画笔Paint paint=new Paint();//创建画笔  对alterBitmap进行作画操作     把白纸铺到画布上Canvas canvas=new Canvas(alterBitmap);//开始作画   按照srcBitmap作为模板作画canvas.drawBitmap(srcBitmap, new Matrix(), paint);iv.setImageBitmap(alterBitmap);//[3]给iv设置一个触摸事件iv.setOnTouchListener(new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {//具体判断一下触摸事件switch(event.getAction()){case MotionEvent.ACTION_MOVE:  //移动事件for (int i = -5; i <5; i++) {//移动一次,通过循环往外扩五个像素,依次使其变透明。for (int j =-5; j < 5; j++) {if(Math.sqrt(i*i+j*j)<5){//撕一个圆//所到之处变透明try {alterBitmap.setPixel((int)event.getX()+i,(int)event.getY()+j, Color.TRANSPARENT);} catch (Exception e) {}}}}//更新一下iviv.setImageBitmap(alterBitmap);break;}return true;}});}
}

计算机表示图形的几种方法。相关推荐

  1. 计算机表示图形的两种方法,图像参数

    电脑美术中,应用最多的就是图像,图像可以分为模拟图像和数字图像两种.数字图像又分为矢量图形和位图图像.在用电脑进行处理时,可以用切换图像模式的方法改变图像的色彩,图像模式可分为彩色模式.黑白模式与灰度 ...

  2. 计算机用户加密,计算机硬盘加密的几种方法

    计算机硬盘加密的几种方法 一.修改硬盘分区表信息 硬盘分区表信息对硬盘的启动至关重要,如果找不到有效的分区表,将不能从硬盘启动或即使从软盘启动也找不到硬盘. 通常,第一个分区表项的第0子节为80H,表 ...

  3. 菱角图形输出c语言,CDR将多边形/图形的角度变圆?CDR制作圆角图形的三种方法

    在CorelDRAW中如何将多边形/图形的角度变圆.可能在以早的版本中,都没有直接实现圆角多边形的功能,直到后来较高版本中提及的圆角/扇形角/倒棱角功能的出现,才很好的解决了这个问题,其实方法也不止是 ...

  4. win2012命令计算机,Windows2012重启的两种方法:cmd命令关机重启分享

    分享者:iweb2020  阅读量:3748 小金子学院目录最新收录:投资寓言故事之鸡的故事 D 囻 囼9困 囱 囲㊣男 Windows2012重启的两种方法:cmd命令关机重启分享 一,window ...

  5. 手机计算机桌面图标恢复,三种方法快速找回桌面图标(附电脑文件恢复教程)...

    三种方法快速找回桌面图标!大家应该都喜欢把自己经常用到的图标放到桌面上吧.当我们需要进行一些操作的时候,直接点击桌面上的图标就能进入相应的界面.大大节省了我们的时间,让我们的办公更加便捷.如果我们的桌 ...

  6. 计算机保持在线的几种方法,还在为智能盒子上电影软件收费烦恼?教你几个盒子上看大片的方法...

    在智能盒子上看电影时候,很多软件都收费了,非常不方便.那么盒子成摆设了吗?不不不,我们通过几种方法是可以看到最新的影视的 第一种,通过盒子的投屏功能,将手机上的图片视频通过盒子在电视上播放,非常简单好 ...

  7. pyqtgraph绘制图:使用PyQtGraph绘制图形的6种方法

    概念:画板,画布 画板位于最底层,用于放置画布它只是辅助工具,并不需要我们实际操作: 画布位于画板之上,是我们绘图的基础: 绘图区是画布上用于绘图的区域,一块画布上可以开辟出多个独立的绘图区. 对于一 ...

  8. 计算机图案填充的两种方法,计算机图形学课件 第9讲 区域填充和字符处理.ppt...

    计算机图形学课件 第9讲 区域填充和字符处理 信息科学与工程学院 1999年7月 5.4.1 多边形的扫描转换 多边形的两种表示方法: 顶点表示:用多边形的顶点序列来刻划多边形.直观.几何意义强.占内 ...

  9. 计算机硬盘加密的几种方法,对于移动硬盘加密方法 你了解多少种呢?

    原标题:对于移动硬盘加密方法 你了解多少种呢? 移动硬盘自然随身携带,有时会丢失.一旦丢失,内部数据将不再安全.如果内部有重要信息,将严重威胁您的信息安全.那么,什么是移动硬盘加密方法?让我们来看看. ...

最新文章

  1. [Quiz]竞赛题目 Word Trace
  2. 利用外部知识增加QA答案自然程度,这是阿里的问答模型新思路丨EMNLP
  3. 模版引擎总结之综合分析模版引擎
  4. 【Python】4500字、10个案例分享几个Python可视化小技巧,助你绘制高质量图表
  5. 10个遥远但近在人间的天堂...
  6. centos mysql 修改mysql用户密码
  7. 计算直方图中面积最大的矩形
  8. wall 广播发送信息给所有user
  9. linux能不能上网页,详解能上QQ不能打开网页的问题
  10. DMSP/OLS夜间灯光数据
  11. 邮件服务器1---原理以及基本概念
  12. c++实现串口功能之termios.h头文件研读<一>
  13. 第三季度编程语言排行榜出炉,它太稳了!
  14. 电机对应的电流计算方式及电线、端子的选型
  15. 计算机专业读研好还是研究生好,计算机专业考研好呢还是直接工作好
  16. cocos2d - JS Sprite 镜像反转显示 ( Flipped )
  17. 电脑文件夹的展示方式
  18. 华为疯狂扩招3000名数据分析师,招聘要求让人窒息!
  19. 【深度学习】损失函数详解
  20. LeetCode Daily challenge - Course Schedule

热门文章

  1. ye graph editor安装
  2. H.265编码视频播放器在播放FLV视频流时出现黑屏,如何解决?
  3. [python之数据分析] 基础篇1- Numpy,Scipy,Matplotlib 快速入门攻略
  4. HDMI EDID timing详细解析
  5. java bidi_Java Bidi isRightToLeft()用法及代码示例
  6. 搞了一个星期的扫码收款, 总结感悟
  7. 使用gltf-pipeline转换gltf、glb模型文件
  8. Excel中index和match结合解决vlookup匹配出错问题
  9. Java中关于子类重写父类方法的坑
  10. python实现随机密码生成