1. 程式人生 > >Bitmap轉灰度位元組陣列byte[]

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);

                }
            });

    }

相關推薦

Bitmap位元組陣列byte[]

工作中遇到圖片轉灰度陣列的需要,經過研究和大神的指導,最終得到如下兩個方法,可以實現點陣圖轉灰度陣列 簡單的點陣圖轉灰度陣列就是:得到點陣圖中的每個畫素點,然後根據畫素點得到RGB值,最後對RGB值,根據灰度演算法得到灰度值即可 /*如一張480*800的圖片,最終得到一

基於FPGA的彩色圖圖演算法

一、演算法基礎 對於彩色轉灰度,有一個很著名的心理學公式:Gray = R0.299 + G0.587 + B*0.114; 來自於RGB888 to YCbCr的演算法公式,我們可以直接把演算法移植到FPGA上,但是我們都知道FPGA無法進行浮點運算,所以我們採取將整個式子右端先都擴大

易學筆記-0:Java語言總結/0.11 Java中輸出的流表示(都是針對位元組陣列byte[ ]操作)

Java中輸出的流表示 針對快取的: ByteArrayOutputStream StringBufferOutputStream 針對檔案的:FileOutputStream 針對物件:ObjectOutputStream

C#中位元組陣列(byte[])和字串相互轉換

轉換過程主要使用到System.Text.Encoding名稱空間下的類 1. 字串轉換成位元組陣列byte[]: string str = "This is test string"; byte[] byteArray = System.Text.Encoding.De

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] } byte[] src ={1,2,3,4,5}; by

NEON 指令集並行技術優化彩色影象圖【Android】

  參考原文: android平臺的neon優化策略 Neon Intrinsics各函式介紹 目前市面上主流的旗艦android手機搭載的Soc都是64位的CPU,常見的armv7指令集的公版架構如Cortex-A8,Cortex-A9,Cortex-A15,常見的

C#:電腦螢幕截圖 , RGB圖圖片

using System; using System.Drawing; using System.Drawing.Imaging; using System.Windows.Forms; namespace test { public partial class Form1 : Form

Matlab影象處理圖,繪製直方圖,直方圖均衡化

1.imread() MATLAB中影象讀取函式與OpenCV一樣是imread,可以開啟指定路徑圖片,其路徑表示方式與OpenCV中有些許不同如: srcImage=imread('E:\MatlabWorkSpace\實驗一\實驗一圖一.png'); 路徑符號為單"\"

彩色演算法(FPGA實現)

一、演算法基礎   對於彩色轉灰度,有一個很著名的心理學公式:Gray = R*0.299 + G*0.587 + B*0.114。 二、整數演算法   而實際應用時,希望避免低速的浮點運算,所以需要整數演算法。   注意到係數都是3位精度的沒有,我們可以將它們縮放1000倍來實現整數運算演算法:

pytorch 彩色影象影象

pytorch 彩色影象轉灰度影象 pytorch 庫 pytorch 本身具有載入cifar10等資料集的函式,但是載入的是3*200*200的張量,當碰到要使用灰度影象時,可以使用他本身的函式進行修改,以較快速的完成彩色影象轉灰度影象 pyt

整型變數(int)與位元組陣列(byte[])的相互轉換

// int2byte.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include <Windows.h> /* #define MAKEWORD(a, b) ((WORD)(((BYTE)(((DWORD_PT

C#: 字串string和位元組陣列byte[]的轉換

string轉byte[]: byte[] byteArray = System.Text.Encoding.Default.GetBytes ( str ); byte[]轉string: string str = System.Text.Encoding.Default.GetStri

【C# 4】文字轉換。串列埠通訊中字串string和位元組陣列byte[]、ASCII的轉換

string轉byte[]:byte[] byteArray = System.Text.Encoding.Default.GetBytes ( str );byte[]轉string:string str = System.Text.Encoding.Default.GetString ( byteArra

Java中位元組陣列byte[]變數間的比較

##方法一: 使用==比較的是兩個位元組陣列是否為同一個位元組陣列,此處不是比較兩個位元組陣列的內容是否相同。 ##方法二: 使用equals方法比較,該方法也是比較是兩個位元組陣列是否為同一個位元組陣列,即equals也不是比較內容的。 ##方法三: 如果是比

RGB圖

biBitCount=16 表示點陣圖最多有216種顏色。每個色素用16位(2個位元組)表示。這種格式叫作高彩色,或叫增強型16位色,或64K色。它的情況比較複雜,當biCompression成員的值是BI_RGB時,它沒有調色盤。16位中,最低的5位表示藍色分量,中間的5位表示綠色分量,高的5位表示紅色分量

C# 三種位元組陣列(byte[])拼接的效能對比測試

之前做的通訊框架,一直用的List<byte>做的資料接收池。今天有點閒暇時間,特地寫了個DEMO將C#中的三種位元組陣列拼接方式的效能做了一個對比測試。 程式碼如下(若程式碼有不嚴謹或錯誤之處,懇請指出。): using System; using Syst

【OpenCV_09】平滑/模糊圖片 Smooth / Blur Images及 彩色圖 圖和二值化

OpenCV 程式碼下面的OpenCV 的程式碼中,核大小從1x1增加到29x29.可以觀察到影象平滑程度隨著核增大的變化程度。平滑影象的核的大小顯示在被平滑影象上。///////////////////////////////////////////////////////////////////////

C#|RBG影象影象與影象反轉

我們將RBG影象轉灰度影象的方法寫成一個函式的形式,輸入為Bitmap格式的影象和影象的長和寬,輸出為byte型的陣列。 根據YUV的顏色空間中,Y的分量的物理意義是點的亮點,由該值反映亮點等級,根據RBG和YUV顏色控制元件的變換關係可建立亮度Y與R、G、B

基於FPGA的RGB影象影象演算法實現

一、前言   最近學習牟新剛編著《基於FPGA的數字影象處理原理及應用》的第六章直方圖操作,由於需要將捕獲的影象轉換為灰度影象,因此在之前程式碼的基礎上加入了RGB影象轉灰度影象的演算法實現。                                                           

關於Bitmapbyte陣列的兩種方式

第一種:用Bitmap物件的compress方法傳一個ByteArrayOutputStream物件,再用傳進去的ByteArrayOutputStream物件呼叫toByteArray方法即可。 程式碼示例: public byte[] getBytesByBitmap(Bitmap bitm