Bitmap对图像的处理
p { margin-bottom: 0.1in; line-height: 120% }
a:link { }
Bitmap对图像的处理
一、引言:
在开发中涉及到图片包括.png,.gif,.9.png,.jpg,Drawable系对象,以及位图Bitmap,那么Bitmap是一个什么角色,如下将做一个详细介绍.
二、Bitmap概述
bitmap(位图图像), 亦称为点阵图像或绘制图像,是由称作像素(图片元素)的单个点组成的.扩展名可以是.bmp或者.dib。它将图像定义为由点(像素)组成,每个点可以由多种色彩表示,包括2、4、8、16、24和32位色彩。例如,一幅1024×768分辨率的32位真彩图片,其所占存储字节数为:1024×768×32/8=3072KB,虽然位图文件图像效果好,但是非压缩格式的,需要占用较大存储空间,不利于在网络上传送Android系统当中,Bitmap是图像处理最重要的中转类之一。用它可以获取图像信息,借助Matrix对图像进行剪切、旋转、缩放等操作,同时还可以指定格式和压缩质量保存图像文件。
三、构造Bitmap对象
Bitmap继承Parcelable,实现在android.graphics包中,是一个可以跨进程传输的对象。但是Bitmap类的构造函数是私有的,外面并不能实例化,只能是通过JNI实例化。Android中Bitmap是采用了工厂的设计模式进行获取此对象.
1、Bitmap静态方法static Bitmap createBitmap()系
public static Bitmap createScaledBitmap(@NonNull Bitmap src, int dstWidth, int dstHeight,boolean filter)//对源位图src缩放成宽为w,高为h的新位图
public static Bitmap createBitmap(@NonNull Bitmap source, int x, int y, int width, int height,@Nullable Matrix m, boolean filter)//从源位图src的指定坐标(x,y)开始,截取宽w,高h的部分,按照Matrix变换创建新的位图对象
public static Bitmap createBitmap(@Nullable DisplayMetrics display, int width, int height,@NonNull Config config, boolean hasAlpha, @NonNull ColorSpace colorSpace) //从原位图获取到一个密度变化的bitmap
2、通过BitmapFactory工厂类的static Bitmap decodeXxx()系
decodeByteArray(byte[] data, int offset, int length) 从指定字节数组的offset位置开始,将长度为length的数据解析成位图
decodeFile(String pathName) 从pathName对应的文件解析成的位图对象
decodeFileDescriptor(FileDescriptor fd) 从FileDescriptor中解析成的位图对象
decodeResource(Resource res,int id) 根据给定的资源Id解析成位图
decodeStream(InputStream in) 把输入流解析成位图
三、Bitmap和Matrix一起使用
以下通过具体例子简单做以介绍.
Activity如下:
package com.example.mytest;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private ImageView mImageView0;
private ImageView mImageView1;
private ImageView mImageView2;
private ImageView mImageView3;
private ImageView mImageView4;
private ImageView mImageView5;
private TextView mTextView;
private Button left,right;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImageView0 = (ImageView)findViewById(R.id.image0);
mImageView1 = (ImageView)findViewById(R.id.image1);
mImageView2 = (ImageView)findViewById(R.id.image2);
mImageView3 = (ImageView)findViewById(R.id.image3);
mImageView4 = (ImageView)findViewById(R.id.image4);
mImageView5 = (ImageView)findViewById(R.id.image5);
mTextView = (TextView)findViewById(R.id.textview);
left=(Button)findViewById(R.id.left);
left.setText("左边");
right=(Button)findViewById(R.id.right);
right.setText("右边");
final Bitmap bmp1=BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher1); //resources资源里
final int width=bmp1.getWidth();
final int height=bmp1.getHeight();
Log.d("TEST"," width: "+ width +" height: "+height);
mImageView1.setImageBitmap(bmp1);//通过Bitmap将图片放入ImageView中显示出来
//缩小为原来一半
Matrix matrix = new Matrix();
matrix.setScale(0.5f, 0.5f);//缩小
Bitmap bmp2 = Bitmap.createBitmap(bmp1, 0, 0, bmp1.getWidth(),
bmp1.getHeight(), matrix, true);
mImageView2.setImageBitmap(bmp2);
//旋转
matrix.postRotate(45.0f);// 旋转45度 == matrix.setSinCos(0.5f, 0.5f);
Bitmap bmp3 = Bitmap.createBitmap(bmp1, 0, 0, bmp1.getWidth(),
bmp1.getHeight(), matrix, true);
mImageView3.setImageBitmap(bmp3);
//平移
Matrix matrix1 = new Matrix();
matrix1.setTranslate(bmp1.getWidth()*30, bmp1.getHeight()*30);// 向左下平移
Bitmap bmp4 = Bitmap.createBitmap(bmp1, 0, 0, bmp1.getWidth(),
bmp1.getHeight(), matrix1, true);
mImageView4.setImageBitmap(bmp4);
//斜切
Matrix matrix2 = new Matrix();
matrix2.setSkew(0.5f, 0.5f);// 斜切
matrix2.postScale(0.5f, 0.5f);// 缩小为原来的一半
Bitmap bmp5 = Bitmap.createBitmap(bmp1, 0, 0, bmp1.getWidth(),
bmp1.getHeight(), matrix2, true);
mImageView5.setImageBitmap(bmp5);
/**
* 缩小
*/
left.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
Matrix matrix = new Matrix();
matrix.setScale(0.5f, 0.5f);
Bitmap bmp5 = Bitmap.createBitmap(bmp1, 0, 0, bmp1.getWidth(),
bmp1.getHeight(), matrix, true);
mImageView3.setImageBitmap(bmp5);
showToast(matrix);
}
});
}
void showToast(Matrix matrix) {
String string = "";
float[] values = new float[9];
matrix.getValues(values);
for (int i = 0; i < values.length; i++) {
string += "matrix.at" + i + "=" + values[i];
}
Toast.makeText(this, string, Toast. LENGTH_LONG).show();
Log.d("TEST"," showToast:" + string);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
布局文件如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
<Button
android:id="@+id/left"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/right"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<ImageView
android:id="@+id/image0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:scaleType="centerInside"
android:src="@drawable/btn_fm_list_favorite_on"
/>
<ImageView
android:id="@+id/image1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:scaleType="centerInside"
android:src="@drawable/btn_fm_list_favorite_on"
/>
<ImageView
android:id="@+id/image2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:scaleType="centerInside"
android:src="@drawable/btn_fm_list_favorite_on"
/>
<ImageView
android:id="@+id/image3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:scaleType="centerInside"
android:src="@drawable/btn_fm_list_favorite_on"
/>
<ImageView
android:id="@+id/image4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:scaleType="centerInside"
android:src="@drawable/btn_fm_list_favorite_on"
/>
<ImageView
android:id="@+id/image5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:scaleType="centerInside"
android:src="@drawable/btn_fm_list_favorite_on"
/>
</LinearLayout>
验证截图如下(由于此处仅作功能,UI美观没太在意,请勿喷,后续改进.)

其中从上到下的布局第一个是取自资源的图片显示,第二个是通过Bitmap将图片放入mImageView1显示出来.根据代码可以依次进行递推看.
问题点:对于平移的不知是平移数太小,还是没有起作用,图片看不出来.本地做了多次调整肉眼没看出来有变化.
如有问题请多指教,以及功能讨论.谢谢.
Bitmap对图像的处理的更多相关文章
- bitmap的图像像素遍历方法
public class FastBitmap { BitmapData bitmapData; public FastBitmap(Bitmap bitmap) { ,,bitmap.Width,b ...
- Asp.net Image控件显示Bitmap生成图像
from:https://blog.csdn.net/qq_29011299/article/details/81137980 using(Bitmap bmp=new Bitmap(300,50)) ...
- Bitmap 图像灰度变换原理浅析
上篇文章<拥抱 C/C++ : Android JNI 的使用>里提到调用 native 方法直接修改 bitmap 像素缓冲区,从而实现将彩色图片显示为灰度图片的方法.这篇文章将介绍该操 ...
- [ActionScript 3.0] AS3.0 将图像的Alpha通道转换为黑白图像(分离ARGB方式)
import flash.display.BitmapData; import flash.display.Bitmap; /** * 将图像的Alpha通道转换为黑白图像(分离ARGB方式) */ ...
- Android图像处理之Bitmap类
Bitmap是Android系统中的图像处理的最重要类之一.用它可以获取图像文件信息,进行图像剪切.旋转.缩放等操作,并可以指定格式保存图像文件.本文从应用的角度,着重介绍怎么用Bitmap来实现 ...
- Android开发之高效加载Bitmap
一.概述 在Android开发中,我们经常与Bitmap打交道,而对Bitmap的不恰当的操作经常会导致OOM(Out of Memory).这篇文章我们会介绍如何高效地在Android开发中使用Bi ...
- Android图像处理之Bitmap类(zz)
Bitmap是Android系统中的图像处理的最重要类之一.用它可以获取图像文件信息,进行图像剪切.旋转.缩放等操作,并可以指定格式保存图像文件.本文从应用的角度,着重介绍怎么用Bitmap来实现这些 ...
- Android应用程序开发之图片操作(一)——Bitmap,surfaceview,imageview,Canvas
Android应用程序开发之图片操作(一)——Bitmap,surfaceview,imageview,Canvas 1,Bitmap对象的获取 首先说一下Bitmap,Bitmap是Androi ...
- 将银行读卡设备读取到的身份证头像Bitmap属性转换成路径
需求是这样的,在项目开发的时候要求读取身份证,读到身份证的所有信息(信息里面包括头像属性,类型是Bitmap的).然后服务器要求我传过去的头像信息是String类型的Uri路径. 这是读卡器读到的身份 ...
随机推荐
- 【数值分析】误差的分析与减少及Matlab解线性方程的四种方法
1.误差的来源 模型误差:数学模型与实际问题之间的误差 观测误差:测量数据与实际数据的误差 方法误差:数学模型的精确解与数值方法得到的数值解之间的误差:例如 舍入误差:对数据进行四舍五入后产生的误差 ...
- 如何设计一个可用的web容器
之前在另外一个平台(http://www.jointforce.com/jfperiodical/article/1035)发表的一篇文章,现在发布到自己的博客上. 开发一个web容器涉及很多不同方面 ...
- Linux - 有效群组(effective group)与初始群组(initial group),groups,newgrp
每个使用者在他的 /etc/passwd 里面的第四栏有所谓的 GID ,那个 GID 就是所谓的『初始群组 (initial group) 』!也就是说,当用户一登陆系统,立刻就拥有这个群组的相关权 ...
- Oracle EBS 预警系统管理(可用于配置工作流发审批邮件)
本章主要讲述配置和设置Oracle EBS预警系统管理, 它比较方便和及时发用户或系统对数据库操作情况.下面讲一操作步聚: 1.预警系统管理-->系统-->选项 名称"Unix ...
- DB Query Analyzer 5.05 is released, 65 articles concerned have been published
DB Query Analyzer 5.05 is released, 65 articles concerned have been published DB Query Analyzer is p ...
- python 字典dict类型合并(不能错过哦)
我要的字典的键值有些是数据库中表的字段名, 但是有些却不是, 我需要把它们整合到一起, 因此有些这篇文章.(非得凑够150个字,我也是没有办法,扯一点昨天的问题吧,话说python中的session就 ...
- Salesforce的数据权限机制
本文主要介绍了 Salesforce 对于系统中数据的访问控制是如何设计的,然后也了解了下 Alfresco 和 Oracle VPD 的数据权限机制.希望对一些业务系统的数据权限的访问控制设计能有所 ...
- 转发 JBPM工作流小结
JBoss 题记:某部门领导有天突发奇想,把我们几个人叫过去,曰:最近出去开会,老有人推销自己的工作流产品,说的这好那好,你们几个给我研究研究.正好刚做完的xxx子系统里有一个申请审批的流程,你们按这 ...
- MySQL/MariaDB的锁
本文目录: 1.MariaDB/MySQL事务提交的方式 2.MariaDB/MySQL中的锁简介 2.1 不同存储引擎支持的锁级别 2.2 锁类型 2.3 锁兼容性 3.MyISAM的表级锁(loc ...
- Install PIL with Jpeg support on Ubuntu Oneiric 64bit
from:http://jj.isgeek.net/2011/09/install-pil-with-jpeg-support-on-ubuntu-oneiric-64bits/ I am posti ...