Bitmap转灰度字节数组byte[]

工作中遇到图片转灰度数组的需要,经过研究和大神的指导,最终得到如下两个方法,可以实现位图转灰度数组

简单的位图转灰度数组就是:得到位图中的每个像素点,然后根据像素点得到RGB值,最后对RGB值,根据灰度算法得到灰度值即可

/*如一张480*800的图片,最终得到一个byte[480*800/2]的灰度数组,因为函数把每两个相邻高的像素灰度转化为一个灰度*/

private byte[] java_convertIMG2GreyArray(Bitmap img) {

byte[] theBytes = null;

/* 得到位图的宽高 */

int width = img.getWidth();

int height = img.getHeight();

/* 取得位图的像素点 */

int[] pixels = new int[width * height];

img.getPixels(pixels, 0, width, 0, 0, width, height);

/* 定义结果数据数组 */

theBytes = new byte[width * height / 2];

/*定义循环中用到的变量,节约内存和时间*/

int x, y, k;

int pixel, r, g, b;

for (y = 0; y < height; y++) {

for (x = 0, k = 0; x < width; x++) {

//依次取得像素点

pixel = pixels[y * width + x];

//得到rgb

r = (pixel >> 16) & 0xFF;

g = (pixel >> 8) & 0xFF;

b = pixel & 0xFF;

/*每两行存为一行*/

if (x % 2 == 1) {

theBytes[k + y * width / 2] = (byte) (theBytes[k + y

* width / 2] | ((r * 299 + g * 587 + b * 114 + 500) / 1000) & 0xf0);

k++;

} else {

theBytes[k + y * width / 2] = (byte) (theBytes[k + y

* width / 2] | (((r * 299 + g * 587 + b * 114 + 500) / 1000) >> 4) & 0x0f);

}

}

}

return theBytes;

}

/*灰度依次转换 如:480 * 800最后得到一个byte[480*800]的灰度数组*/

private void java_convertIMGtoGreyArray(Bitmap img) {

boolean usedebug = true;

if (debugImage == null || debugUihandler == null)

usedebug = false;

int width = img.getWidth(); // 获取位图的宽

int height = img.getHeight(); // 获取位图的高

theBytes = null;

theBytes = new byte[width * height];

int[] pixels = new int[width * height]; // 通过位图的大小创建像素点数组

img.getPixels(pixels, 0, width, 0, 0, width, height);

for (int i = 0; i < height; i++) {

for (int j = 0; j < width; j++) {

int colorAtPixel = pixels[width * i + j];

int alpha = (colorAtPixel >> 24) & 0xFF;

int red = (colorAtPixel >> 16) & 0xFF;

int green = (colorAtPixel >> 8) & 0xFF;

int blue = colorAtPixel & 0xFF;

theBytes[width * i + j] = (byte) ((red + green + blue) / 3);

int theb = (0xff & theBytes[width * i + j]);

pixels[width * i + j] = alpha << 24 | theb << 16 | theb << 8

| theb;

}

}

bmo = img;

bmo.setPixels(pixels, 0, width, 0, 0, width, height);

pixels = null;

if (debugUihandler != null)

debugUihandler.post(new Runnable() {

@Override

public void run() {

if (debugImage != null && bmo != null)

debugImage.setImageBitmap(bmo);

}

});

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-29 21:56:56

Bitmap转灰度字节数组byte[]的相关文章

整型变量(int)与字节数组(byte[])的相互转换

// int2byte.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <Windows.h> /* #define MAKEWORD(a, b) ((WORD)(((BYTE)(((DWORD_PTR)(a)) & 0xff)) | ((WORD)((BYTE)(((DWORD_PTR)(b)) & 0xff))) << 8)) #define MAKELONG(a, b) ((LONG

Java基础知识强化之IO流笔记27:FileInputStream读取数据一次一个字节数组byte[ ]

1. FileInputStream读取数据一次一个字节数组byte[ ]  使用FileInputStream一次读取一个字节数组: int read(byte[]  b) 返回值:返回值其实是实际读取的字节个数 . 2. 代码示例: 1 package com.himi.fileinputstream; 2 3 import java.io.FileInputStream; 4 import java.io.IOException; 5 6 7 8 /** 9 * 10 * 使用FileIn

字节数组byte[]和整型,浮点型数据的转换——Java代码

近期在写C++ socket和java socket之间的通信程序,涉及到整数浮点数的传输.须要从字节数组还原数据,查了一些资料.总结例如以下 1.       整数和浮点数的机器表示 在机器内部.不论是一个整数还是浮点数.都是以一个二进制串的形式存储. 整数可能是原码.补码表示,浮点数有阶码尾数两部分构成.不管如何都是一个二进制串.可是这个二进制串如何表示不同的机器可能採取不同的方案. 关于浮点数: 一个机器上的32位浮点数的二进制串在还有一个机器把它作为32位浮点数解释时可能得到不同的值,这

C#中字节数组(byte[])和字符串相互转换

转换过程主要使用到System.Text.Encoding命名空间下的类 1. 字符串转换成字节数组byte[]: string str = "This is test string"; byte[] byteArray = System.Text.Encoding.Default.GetBytes(str); 2.字节数组换成字符串: byte[] byteArray = 通过某种方式获取到的字节数组 string str = System.Text.Encoding.Default

C#-----字节数组(byte[])和字符串相互转换

   Encoding类  表示字符编码 1.字符串转换成字节数组byte[] using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FileStreamTest { class Program { static void Main(string[] args) {

Android学习之Bitmap对象与字节数组相互转换

1.将Bitmap对象读到字节数组中 ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); byte[] datas = baos.toByteArray(); 2.将字节数组转为Bitmap对象 byte[] b = getIntent().getByteArrayExtra("bitmap"); Bitmap

C#--整型与字节数组byte[]之间的转换

转:https://www.cnblogs.com/dayang12525/p/6393941.html using System; int  i = 123;byte [] intBuff = BitConverter.GetBytes(i);     // 将 int 转换成字节数组lob.Write(intBuff, 0, 4);i = BitConverter.ToInt32(intBuff, 0);           // 从字节数组转换成 int double x = 123.45

C# 中字符串string和字节数组byte[]的转换

string转byte[]: byte[] byteArray = System.Text.Encoding.Default.GetBytes ( str ); byte[]转string: string str = System.Text.Encoding.Default.GetString ( byteArray ); string转ASCII byte[]: byte[] byteArray = System.Text.Encoding.ASCII.GetBytes ( str ); AS

C# 常见的字节数组 byte[] 复制方法

byte[] src ={1,2,3,4,5}; byte[] dest = new byte[src.Length]; for(int i=0; i<src.Length; i++) { dest[i] = src[i] } 1 byte[] src ={1,2,3,4,5}; 2 byte[] dest = new byte[src.Length]; 3 Array.Copy(src, dest, src.Length); byte[] src ={1,2,3,4,5}; byte[] de