一:计算机表示图形的几种方式
二:Android加载大图片
原理:
[1]获取手机分辨率
[2]获取图片分辨率
创建位图工厂的配置参数
获取图片宽高
[3]计算缩放比例
[4]显示缩放后的图片
示例代码:
@SuppressLint("SdCardPath")
public class MainActivity extends Activity {
private int height;
private int width;
@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//[1]获取手机分辨率
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
width = wm.getDefaultDisplay().getWidth();
height = wm.getDefaultDisplay().getHeight();
System.out.println("height:"+height+" width:"+width);
//[2]获取图片分辨率
//创建位图工厂的配置参数
Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile("/mnt/sdcard/dx.jpg", options);
//获取图片宽高
int outWidth = options.outWidth;
int outHeight = options.outHeight;
System.out.println(outHeight+" "+outWidth);
//[3]计算缩放比例
int scale = 1;
int scaleX = outWidth / width;
int scaleY = outHeight / height;
if (scaleX > scaleY) {
scale = scaleX;
} else if (scaleX < scaleY) {
scale = scaleY;
}
//[4]显示缩放后的图片
options.inSampleSize = scale;
options.inJustDecodeBounds = false;
Bitmap bm = BitmapFactory.decodeFile("/mnt/sdcard/dx.jpg", options);
ImageView iv_bigpic = (ImageView) findViewById(R.id.iv_bigpic);
iv_bigpic.setImageBitmap(bm);
// ImageView iv_bigpic = (ImageView) findViewById(R.id.iv_bigpic);
// Bitmap bm = BitmapFactory.decodeFile("/mnt/sdcard/dx.jpg");
// //08-21 11:42:14.065: E/AndroidRuntime(2766): java.lang.OutOfMemoryError
// //08-21 11:42:13.895: I/dalvikvm-heap(2766): Forcing collection of SoftReferences for 30720012-byte allocation
//
// iv_bigpic.setImageBitmap(bm);
}
}
三:创建一个原图的副本来操作图片
原理:
[2.1]创建一个模板 相当于 创建了一个大小和原图一样的 空白的白纸
Bitmap copybiBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), srcBitmap.getConfig());
[2.2]想作画需要一个画笔
Paint paint = new Paint();
[2.3]创建一个画布 把白纸铺到画布上
Canvas canvas = new Canvas(copybiBitmap);
[2.4]开始作画
canvas.drawBitmap(srcBitmap, new Matrix(), paint);
[2.5]操作画出来的小猫图片
copybiBitmap.setPixel(20+i, 30, Color.RED);
示例代码:
public class MainActivity extends Activity {
@Override
protected 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]先把tomcat.png 图片转换成bitmap 显示到iv_src
Bitmap srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.tomcat);
//[1.1]操作图片
// srcBitmap.setPixel(20, 30, Color.RED);
iv_src.setImageBitmap(srcBitmap);
//[2]创建原图的副本
//[2.1]创建一个模板 相当于 创建了一个大小和原图一样的 空白的白纸
Bitmap copybiBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), srcBitmap.getConfig());
//[2.2]想作画需要一个画笔
Paint paint = new Paint();
//[2.3]创建一个画布 把白纸铺到画布上
Canvas canvas = new Canvas(copybiBitmap);
//[2.4]开始作画
canvas.drawBitmap(srcBitmap, new Matrix(), paint);
//[2.5]操作画出来的小猫图片
for (int i = 0; i < 20; i++) {
copybiBitmap.setPixel(20+i, 30, Color.RED);
}
//[3]把copybimap显示到iv_copy上
iv_copy.setImageBitmap(copybiBitmap);
}
}
程序运行结果:
四:图形处理的API
原理:
canvas.drawBitmap(srcBitmap,matrix , paint);
matrix的方法,操作图片
- 旋转
matrix.setRotate(20, srcBitmap.getWidth()/2, srcBitmap.getHeight()/2);
- 缩放
matrix.setScale(0.5f, 0.5f);
- 平移
matrix.setTranslate(30, 0);
- 镜面效果
// matrix.setScale(-1.0f, 1);
//post是在上一次修改的基础上进行再次修改 set 每次操作都是最新的 会覆盖上次的操作
// matrix.postTranslate(srcBitmap.getWidth(), 0);
- 倒影效果
//[2,7]倒影效果
matrix.setScale(1.0f, -1);
//post是在上一次修改的基础上进行再次修改 set 每次操作都是最新的 会覆盖上次的操作
matrix.postTranslate(0, srcBitmap.getHeight());
示例代码:
public class MainActivity extends Activity {
@Override
protected 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]先把tomcat.png 图片转换成bitmap 显示到iv_src
Bitmap srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.tomcat);
//[1.1]操作图片
// srcBitmap.setPixel(20, 30, Color.RED);
iv_src.setImageBitmap(srcBitmap);
//[2]创建原图的副本
//[2.1]创建一个模板 相当于 创建了一个大小和原图一样的 空白的白纸
Bitmap copybiBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), srcBitmap.getConfig());
//[2.2]想作画需要一个画笔
Paint paint = new Paint();
//[2.3]创建一个画布 把白纸铺到画布上
Canvas canvas = new Canvas(copybiBitmap);
//[2.4]开始作画
Matrix matrix = new Matrix();
//[2.5]对图片进行旋转
//matrix.setRotate(20, srcBitmap.getWidth()/2, srcBitmap.getHeight()/2);
//[2.5]对图片进行
// matrix.setScale(0.5f, 0.5f);
//[2.6]对图片进行平移
// matrix.setTranslate(30, 0);
//[2.7]镜面效果 如果2个方法一起用
// matrix.setScale(-1.0f, 1);
//post是在上一次修改的基础上进行再次修改 set 每次操作都是最新的 会覆盖上次的操作
// matrix.postTranslate(srcBitmap.getWidth(), 0);
//[2,7]倒影效果
matrix.setScale(1.0f, -1);
//post是在上一次修改的基础上进行再次修改 set 每次操作都是最新的 会覆盖上次的操作
matrix.postTranslate(0, srcBitmap.getHeight());
canvas.drawBitmap(srcBitmap,matrix , paint);
//[3]把copybimap显示到iv_copy上
iv_copy.setImageBitmap(copybiBitmap);
}
}
程序运行效果:
网友评论