android图像处理之灰度化
来源:互联网 发布:政府网络维护员工资 编辑:程序博客网 时间:2024/06/13 08:38
package com.scy.grayvalue2;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import android.os.Bundle;import android.os.Environment;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.Bitmap.Config;import android.graphics.BitmapFactory;import android.util.Log;import android.view.Menu;import android.widget.ImageView;/** * 思路如下: 1.读取or照相,得到一张ARGB图片。 2.转化为bitmap类,并对其数据做如下操作: A通道保持不变,然后逐像素计算:X = 0.3×R+0.59×G+0.11×B,并使这个像素的值新R,G,B值为X,即: new_R = X, new_G = X, new_B = X 例如:原来一个像素是4个byte,分别为ARGB,现在这个像素应该为AXXX。 3.将上一步骤得到的bitmap图像写到输出流里面,并保存为图片。或者直接显示在ImageView上。 * @author scy * */public class MainActivity extends Activity {private byte[] rawData;private ImageView imageView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = (ImageView)findViewById(R.id.image); //将bitmap转换成一个伪灰度图,再转化成一个byte[] //将byte[]转换为bitmap//Bitmap bitmapOrg = BitmapFactory.decodeByteArray(rawData, 0, rawData.length); Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);Bitmap bitmapNew = bitmapOrg.copy(Config.ARGB_8888, true); //Bitmap bitmapNew = bitmapOrg.copy(Config.ARGB_8888, true);if(bitmapNew == null)Log.i("TAG", "null");Log.i("TAG", "copy end");/** * 一种简单的灰度化算法,但是这种方法需要修改每个点的像素,如果一张图片比较大,则这个处理速度就堪忧了 * 往往需要创建一个线程来处理 */ for(int i = 0;i<bitmapNew.getWidth();i++) { for(int j =0;j<bitmapNew.getHeight();j++) { int col = bitmapNew.getPixel(i, j);//获取点(i,j)处的像素 //分别获取ARGB的值 int alpha = col&0xFF000000; int red = (col&0x00FF0000)>>16; int green = (col&0x0000FF00)>>8; int blue = (col&0x000000FF); //用公式X = 0.3×R+0.59×G+0.11×B计算出X代替原来的RGB int gray = (int)((float)red*0.3+(float)green*0.59+(float)blue*0.11); //新的ARGB int newColor = alpha|(gray<<16)|(gray<<8)|gray; //在点(i,j)处设置新的像素 bitmapNew.setPixel(i, j, newColor); //Log.v("tag", Integer.toHexString(col)); } } Log.i("TAG", "pro end"); sendMsg(bitmapNew); /* File file = new File(Environment.getExternalStorageDirectory()+File.separator+"gray"+number+".jpg"); OutputStream out;try {out = new FileOutputStream(file);if(bitmapNew.compress(Bitmap.CompressFormat.JPEG, 100, out))Log.i("TAG", "success");out.close();} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} */}private void sendMsg(Bitmap bitmapNew){imageView.setImageBitmap(bitmapNew);}}/** * drawableToBitmap *//* public static Bitmap drawableToBitmap(Drawable drawable) { Bitmap bitmap = Bitmap .createBitmap( drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565); Canvas canvas = new Canvas(bitmap); //canvas.setBitmap(bitmap); drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); drawable.draw(canvas); return bitmap;} *//** * Bitmap2Bytes *//* private byte[] Bitmap2Bytes(Bitmap bm) {ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.PNG, 100, baos); return baos.toByteArray(); }*//** * Bytes2Bimap *//* private Bitmap Bytes2Bimap(byte[] b) { if(b.length ==0) { return null; }return BitmapFactory.decodeByteArray(b, 0, b.length); }*/
最后介绍了几种图片转换方法。
下面是另外一种灰度化方法:
package com.scy.grayvalue;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import android.os.Bundle;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.Bitmap.Config;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.ColorMatrix;import android.graphics.ColorMatrixColorFilter;import android.graphics.Paint;import android.view.Menu;import android.widget.ImageButton;import android.widget.ImageView;public class MainActivity extends Activity {private Bitmap bitmap,buffer;private ImageView imageView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); buffer = convert2Gray(bitmap); /* //创建八位图 buffer = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888); //将八位图作为画布 Canvas canvas = new Canvas(buffer); Paint paint = new Paint(); paint.setColorFilter(filter); canvas.drawBitmap(buffer, 0, 0, paint); canvas.save(); */ imageView = (ImageView)findViewById(R.id.image); imageView.setImageBitmap(buffer); /* File file = new File("/mnt/1.jpg"); FileOutputStream os = null; try{os = new FileOutputStream(file);bitmap.compress(Bitmap.CompressFormat.JPEG, 80, os);os.flush();os.close();} catch (FileNotFoundException e){e.printStackTrace();} catch (IOException e){e.printStackTrace();}*/ }private Bitmap convert2Gray(Bitmap bitmap){ /** * [ a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t ] When applied to a color [r, g, b, a], * the resulting color is computed as (after clamping) * R' = a*R + b*G + c*B + d*A + e; G' = f*R + g*G + h*B + i*A + j; * B' = k*R + l*G + m*B + n*A + o; A' = p*R + q*G + r*B + s*A + t; */ ColorMatrix colorMatrix = new ColorMatrix(); /** * Set the matrix to affect the saturation(饱和度) of colors. * A value of 0 maps the color to gray-scale(灰阶). 1 is identity */ colorMatrix.setSaturation(0); ColorMatrixColorFilter filter = new ColorMatrixColorFilter(colorMatrix); Paint paint = new Paint(); paint.setColorFilter(filter); Bitmap result = bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888); Canvas canvas = new Canvas(result); canvas.drawBitmap(bitmap, 0, 0, paint); return result;}}
- android图像处理之灰度化
- 图像处理之灰度化
- 图像处理之图像灰度化
- 图像处理之图像灰度化
- 图像灰度化处理
- 图像处理:图像灰度化
- delphi图像灰度化处理
- 图像处理第一步:灰度化
- VC图像处理之灰度化与中值滤波
- 深入了解android平台的jni---图像灰度化处理
- 深入了解android平台的jni---图像灰度化处理
- 深入了解android平台的jni---图像灰度化处理
- 深入了解android平台的jni---图像灰度化处理
- Android下常用的图像处理程序(灰度化、线性灰度变化、二值化)
- Android下常用的图像处理程序(灰度化、线性灰度变化、二值化)
- 图像处理之特殊灰度算法技巧
- 图像处理-基本算法之灰度拉伸
- 图像处理-基本算法之灰度均衡
- android更新桌面小插件widget的imageview时 出现!!! FAILED BINDER TRANSACTION !!!错误
- Java桌面程序打包成exe可执行文件
- 火狐浏览器强大的组件 firebug
- ios 导航栏风格
- Java传统Socket实例——TimeServer
- android图像处理之灰度化
- sql语句小练习
- jsp 解析xml
- maven中的<scope>
- Linux主分区,扩展分区,逻辑分区的联系和区别
- Hdu 3999 - The order of a Tree
- WebKit 内核源代码分析系列
- mysql命令大全
- unity基础开发----导入模型碰撞检测