Android程序開發(fā)如何處理圖像格式類及圖像轉(zhuǎn)換
在Android程序開發(fā)過程中,明確哪些圖像格式類(ImageFormat、PixelFormat及BitmapConfig等)及圖像(JPG、PNG及BMP等)的轉(zhuǎn)換方式非常重要,在以后的程序開發(fā)過程中會(huì)起到非常重要的作用。在一個(gè)項(xiàng)目開發(fā)過程中一款軟件的開發(fā)和圖像處理有著密切的關(guān)系,特別是在移動(dòng)應(yīng)用程序,在視覺效果等方面起到至關(guān)重要的作用,因?yàn)檫@關(guān)系到用戶體驗(yàn)度。下面通過代碼實(shí)例給大家分享下:
關(guān)于圖像格式類,介紹以下三個(gè):ImageFormat、PixelFormat及BitmapConfig。
1、ImageFormat(android.graphics.ImageFormat),格式參數(shù)有以下幾種:
int JPEG ,Encoded formats,常量值: 256 (0x00000100)
int NV16,YCbCr format, used for video,16 (0x00000010)
int NV21,YCrCb format used for images, which uses the NV21 encoding format,常量值: 17 (0x00000011)
int RGB_565,RGB format used for pictures encoded as RGB_565,常量值: 4 (0x00000004)
int UNKNOWN, 常量值:0 (0x00000000)
int YUY2,YCbCr format used for images,which uses YUYV (YUY2) encoding format,20 (0x00000014)
int YV12,Android YUV format,This format is exposed to software decoders and applications
YV12 is a 4:2:0 YCrCb planar format comprised of a WxH Y plane followed by (W/2) x (H/2) Cr and Cb planes
解釋總是英文的最通俗易懂,這里就不獻(xiàn)丑翻譯了。用法舉例,在構(gòu)建ImageReader類的對(duì)象時(shí),會(huì)用到ImageFormat類的圖像格式對(duì)象。如
ImageReader imageReader = ImageReader.newInstance(width, height, ImageFormat.RGB_565, 2);
imageReader對(duì)象表示其緩存中最多存在寬高分別為width和height、RGB_565格式的圖像流兩幀。
在需求中用哪一種圖像格式,要視實(shí)際情況而定,后面的類似。
2、PixelFormat(android.graphics.PixelFormat),格式參數(shù)有以下幾種:
int A_8,常量值:8 (0x00000008)
int JPEG,常量值:256 (0x00000100),constant,已聲明不贊成使用,use ImageFormat.JPEG instead.
int LA_88,常量值:10 (0x0000000a)
int L_8, 常量值:9 (0x00000009)
int OPAQUE,常量值: -1 (0xffffffff),System chooses an opaque format (no alpha bits required)
int RGBA_4444,常量值:7 (0x00000007)
int RGBA_5551,常量值:6 (0x00000006)
int RGBA_8888,常量值:1 (0x00000001)
int RGBX_8888,常量值:2 (0x00000002)
int RGB_332,常量值:11 (0x0000000b)
int RGB_565,常量值:4 (0x00000004)
int RGB_888,常量值:3 (0x00000003)
int TRANSLUCENT,常量值: -3 (0xfffffffd),System chooses a format that supports translucency (many alpha bits)
int TRANSPARENT,常量值:-2 (0xfffffffe),System chooses a format that supports transparency (at least 1 alpha bit)
int UNKNOWN,常量值: 0 (0x00000000)
int YCbCr_420_SP,常量值:17 (0x00000011),constant 已聲明不贊成使用 use ImageFormat.NV21 instead
int YCbCr_422_I,常量值: 20 (0x00000014),constant 已聲明不贊成使用 use ImageFormat.YUY2 instead
int YCbCr_422_SP,常量值:16 (0x00000010),constant 已聲明不贊成使用 use ImageFormat.NV16 instead
注意,有四種圖像格式已被聲明不贊成使用,可以用ImaggFormat相對(duì)應(yīng)的格式進(jìn)行代替。由此可知,兩種圖像格式之間存在相通之處。用法舉例,讓窗口實(shí)現(xiàn)漸變的效果,如
getWindow().setFormat(PixelFormat.RGBA_8888);
補(bǔ)充說明:RGBA_8888為android的一種32位顏色格式,R、G、B、A分別用八位表示,Android默認(rèn)的圖像格式是PixelFormat.OPAQUE,其是不帶Alpha值的。
3、Bitmap.Config(Android.graphics.Bitmap內(nèi)部類)
Possible bitmap configurations。A bitmap configuration describes how pixels are stored。This affects the quality (color depth) as well as the ability to display transparent/translucent colors。(
官網(wǎng)介紹,大致意思是說:影響一個(gè)圖片色彩色度顯示質(zhì)量主要看位圖配置,顯示圖片時(shí)透明還是半透明)。
ALPHA_8:Each pixel is stored as a single translucency (alpha) channel。(原圖的每一個(gè)像素以半透明顯示)
ARGB_4444:This field was deprecated in API level 13。Because of the poor quality of this configuration, it is advised to use ARGB_8888 instead。(在API13以后就被棄用了,建議使用8888)。
ARGB_8888 :Each pixel is stored on 4 bytes。 Each channel (RGB and alpha for translucency) is stored with 8 bits of precision (256 possible values) 。This configuration is very flexible and offers the best quality。 It should be used whenever possible。(每個(gè)像素占4個(gè)字節(jié),每個(gè)顏色8位元,反正很清晰,看著很舒服)。
RGB_565:Each pixel is stored on 2 bytes and only the RGB channels are encoded:red is stored with 5 bits of precision (32 possible values),green is stored with 6 bits of precision (64 possible values) and blue is stored with 5 bits of precision。(這個(gè)應(yīng)該很容易理解了)。
用法舉例,構(gòu)建Bitmap對(duì)象時(shí),會(huì)用到BitmapConfig類圖像格式對(duì)象,如:
Bitmap bitmap = Bitmap.createBitmap(width, height,Bitmap.Config.RGB_565)
下面來看各種類型圖像之間的轉(zhuǎn)換都有哪些方法、差異及共同點(diǎn)。
1、YUV轉(zhuǎn)JPG
查閱到的資料大部分是把Yuv圖像數(shù)據(jù)通過數(shù)學(xué)運(yùn)算得到每個(gè)像素點(diǎn)的RGB編碼,存入Bitmap對(duì)象,再調(diào)用Bitmap類自帶的壓縮方法生成JPG圖片。這種方法效率極低,一張480x320分辨率的圖片有20萬個(gè)字節(jié),因此運(yùn)算需要經(jīng)過20萬次循環(huán)。其實(shí)android.graphics包下面有一個(gè)YuvImage類,可以將數(shù)據(jù)直接導(dǎo)入:
YuvImage image = new YuvImage(data, ImageFormat.NV21, IMG_WIDTH, IMG_HEIGHT, null);
前面兩個(gè)參數(shù)決定了數(shù)據(jù)源與圖像格式,后面單個(gè)參數(shù)就不解釋了。
而YuvImage類正好有一個(gè)compressToJPEG(Rect rect, int i, OutputStream)方法,可以直接將數(shù)據(jù)保存在JPG文件的輸出流中。
2、PNG轉(zhuǎn)Bitmap
byte[] data = null; File pngImage = null; BufferedOutputStream stream = null; try { pngImage = new File(outputFile); //outputFile為png圖像名稱 FileOutputStream fstream = new FileOutputStream(pngImage); stream = new BufferedOutputStream(fstream); stream.write(data); } catch (Exception e) { e.printStackTrace(); } finally { if (stream != null) { try { stream.close(); } catch (IOException e) { e.printStackTrace(); } } } Bitmap bitmap=BitmapFactory.decodeByteArray(data, 0, data.length);
如果通過資源(drawable)的形式,那就方便地多,只需要一句話。
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
雖然沒有華麗的算法,但效果不錯(cuò)哦,就是想改變圖像屬性時(shí)得另外實(shí)現(xiàn)。
3、ARGB轉(zhuǎn)Bitmap
Bitmap bitmapOrg = BitmapFactory.decodeByteArray(rawData, 0, rawData.length); Bitmap bitmapNew = bitmapOrg.copy(Config.ARGB_8888, true); if(bitmapNew == null) return; for(int i = 0;i<bitmapNew.getWidth();i++) { for(int j =0;j<bitmapNew.getHeight();j++) { int col = bitmapNew.getPixel(i, j); int alpha = col&0xFF000000; int red = (col&0x00FF0000)>>16; int green = (col&0x0000FF00)>>8; int blue = (col&0x000000FF); int gray = (int)((float)red*0.3+(float)green*0.59+(float)blue*0.11); int newColor = alpha|(gray<<16)|(gray<<8)|gray; } } 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)) out.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
以上全部?jī)?nèi)容就是在Android程序開發(fā)過程中處理圖像格式類及圖像轉(zhuǎn)換的方法,需要注意的是,在代碼中做了灰度處理,若想得到彩色圖,分別對(duì)Bitmap圖像R、G、B三通道賦值。希望大家能夠喜歡。
- android圖像繪制(七)ClipRect局部繪圖/切割原圖繪制總結(jié)
- Android開發(fā)技巧之像QQ一樣輸入文字和表情圖像
- Android圖片處理:識(shí)別圖像方向并顯示實(shí)例教程
- Android開發(fā)之圖形圖像與動(dòng)畫(三)Animation效果的XML實(shí)現(xiàn)
- Android處理圖像數(shù)據(jù)轉(zhuǎn)換的各種方法
- Android中將View的內(nèi)容保存為圖像的簡(jiǎn)單實(shí)例
- android打開本地圖像的方法
- android中圖形圖像處理之drawable用法分析
- Android編程開發(fā)之EditText實(shí)現(xiàn)輸入QQ表情圖像的方法
- android中圓角圖像生成方法
- Android編程滑動(dòng)效果之Gallery仿圖像集瀏覽實(shí)現(xiàn)方法
- Android裁剪圖像實(shí)現(xiàn)方法示例
相關(guān)文章
Android筆記之:在ScrollView中嵌套ListView的方法
本篇文章是對(duì)Android中在ScrollView中嵌套ListView的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05Android編程之非調(diào)用系統(tǒng)界面實(shí)現(xiàn)發(fā)送彩信的方法(MMS)
這篇文章主要介紹了Android編程之非調(diào)用系統(tǒng)界面實(shí)現(xiàn)發(fā)送彩信的方法,涉及Android源碼中的mms的使用技巧,需要的朋友可以參考下2016-01-01Android上使用ZXing識(shí)別條形碼與二維碼的方法
這篇文章主要介紹了Android上使用ZXing識(shí)別條形碼與二維碼的方法,需要的朋友可以參考下2014-08-08Android 類似UC瀏覽器的效果:向上滑動(dòng)地址欄隱藏功能
這篇文章主要介紹了Android 類似UC瀏覽器的效果:向上滑動(dòng)地址欄隱藏功能,需要的朋友可以參考下2017-12-12如何在Android Studio下進(jìn)行NDK開發(fā)
這篇文章主要介紹了如何在Android Studio下進(jìn)行NDK開發(fā),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05Android 中自定義Dialog樣式的Activity點(diǎn)擊空白處隱藏軟鍵盤功能(dialog不消失)
項(xiàng)目中需要開發(fā)帶有EditText的Dialog顯示,要求在編輯完EditText時(shí),點(diǎn)擊Dilog的空白處隱藏軟鍵盤。但是Dialog不會(huì)消失。下面通過實(shí)例代碼給大家分享實(shí)現(xiàn)方法,需要的的朋友參考下吧2017-04-04Android基礎(chǔ)之startActivityForResult()的用法詳解
這篇文章主要給大家介紹了Android中startActivityForResult()的用法,文中給出了詳細(xì)的介紹與示例代碼,相信對(duì)大家的理解和學(xué)習(xí)具有一定參考借鑒價(jià)值,有需要的朋友們下面來一起看看吧。2017-01-01Android Retrofit和Rxjava的網(wǎng)絡(luò)請(qǐng)求
這篇文章主要介紹了Android Retrofit和Rxjava的網(wǎng)絡(luò)請(qǐng)求的相關(guān)資料,需要的朋友可以參考下2017-03-03