java中如何使用BufferedImage判斷圖像通道順序并轉(zhuǎn)RGB/BGR
java中BufferedImage判斷圖像通道順序并轉(zhuǎn)RGB/BGR
一般來說Java ImageIO處理讀取圖像時,一般是RGB或ARGB格式,但是有的時候,我們需要圖像是BGR格式,
比如通過JNI將圖像矩陣傳遞給動態(tài)庫,動態(tài)庫里用OpenCV來處理矩陣,而用OpenCV處理圖像時默認(rèn)通道順序是BGR,這時就需要一個到BGR轉(zhuǎn)換。
翻了好Java API好久,還真沒發(fā)現(xiàn)有直接將RGB轉(zhuǎn)BGR的方法,于是只好自己寫一個,以下是代碼片段,用于實(shí)現(xiàn)判斷BufferedImage圖像類型及通道順序,并將BufferedImage轉(zhuǎn)為RGB或BGR
實(shí)例代碼:
/**
* @param image
* @param bandOffset 用于判斷通道順序
* @return
*/
private static boolean equalBandOffsetWith3Byte(BufferedImage image,int[] bandOffset){
if(image.getType()==BufferedImage.TYPE_3BYTE_BGR){
if(image.getData().getSampleModel() instanceof ComponentSampleModel){
ComponentSampleModel sampleModel = (ComponentSampleModel)image.getData().getSampleModel();
if(Arrays.equals(sampleModel.getBandOffsets(), bandOffset)){
return true;
}
}
}
return false;
}
/**
* 判斷圖像是否為BGR格式
* @return
*/
public static boolean isBGR3Byte(BufferedImage image){
return equalBandOffsetWith3Byte(image,new int[]{0, 1, 2});
}
/**
* 判斷圖像是否為RGB格式
* @return
*/
public static boolean isRGB3Byte(BufferedImage image){
return equalBandOffsetWith3Byte(image,new int[]{2, 1, 0});
}
/**
* 對圖像解碼返回RGB格式矩陣數(shù)據(jù)
* @param image
* @return
*/
public static byte[] getMatrixRGB(BufferedImage image) {
if(null==image)
throw new NullPointerException();
byte[] matrixRGB;
if(isRGB3Byte(image)){
matrixRGB= (byte[]) image.getData().getDataElements(0, 0, image.getWidth(), image.getHeight(), null);
}else{
// 轉(zhuǎn)RGB格式
BufferedImage rgbImage = new BufferedImage(image.getWidth(), image.getHeight(),
BufferedImage.TYPE_3BYTE_BGR);
new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_sRGB), null).filter(image, rgbImage);
matrixRGB= (byte[]) rgbImage.getData().getDataElements(0, 0, image.getWidth(), image.getHeight(), null);
}
return matrixRGB;
}
/**
* 對圖像解碼返回BGR格式矩陣數(shù)據(jù)
* @param image
* @return
*/
public static byte[] getMatrixBGR(BufferedImage image){
if(null==image)
throw new NullPointerException();
byte[] matrixBGR;
if(isBGR3Byte(image)){
matrixBGR= (byte[]) image.getData().getDataElements(0, 0, image.getWidth(), image.getHeight(), null);
}else{
// ARGB格式圖像數(shù)據(jù)
int intrgb[]=image.getRGB(0, 0, image.getWidth(), image.getHeight(), null, 0, image.getWidth());
matrixBGR=new byte[image.getWidth() * image.getHeight()*3];
// ARGB轉(zhuǎn)BGR格式
for(int i=0,j=0;i<intrgb.length;++i,j+=3){
matrixBGR[j]=(byte) (intrgb[i]&0xff);
matrixBGR[j+1]=(byte) ((intrgb[i]>>8)&0xff);
matrixBGR[j+2]=(byte) ((intrgb[i]>>16)&0xff);
}
}
return matrixBGR;
}
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
解決@NonNull @org.jetbrains.annotations.NotNull報紅的問題
這篇文章主要介紹了解決@NonNull @org.jetbrains.annotations.NotNull報紅的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01
解決引用jip-common jar包,報401 Unauthorized錯誤問題
這篇文章主要介紹了解決引用jip-common jar包,報401 Unauthorized錯誤問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03
【Java】BigDecimal實(shí)現(xiàn)加減乘除運(yùn)算代碼
本篇文章主要介紹了【Java】BigDecimal實(shí)現(xiàn)加減乘除運(yùn)算代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02
eclipse實(shí)現(xiàn)Schnorr數(shù)字簽名
這篇文章主要為大家詳細(xì)介紹了eclipse實(shí)現(xiàn)Schnorr數(shù)字簽名,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-06-06
Java實(shí)現(xiàn)FTP服務(wù)器功能實(shí)例代碼
FTP(File Transfer Protocol 文件傳輸協(xié)議)是Internet 上用來傳送文件的協(xié)議,本文給大家分享Java實(shí)現(xiàn)FTP服務(wù)器功能實(shí)例代碼,對java實(shí)現(xiàn)ftp服務(wù)器相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧2015-12-12

