1. 程式人生 > >RGBA 圖片格式轉換 RGB 無損

RGBA 圖片格式轉換 RGB 無損

拿到的圖片是webp格式的,然後系統無法處理。只能使用google code的dwebp工具,把圖片轉成png或者jpg的。

這一步是ok了。

但是轉成的圖片是RGBA的,系統只能處理RGB。。。

報了下面的錯:

java.lang.ArrayIndexOutOfBoundsException: 3
	at java.awt.image.ComponentSampleModel.getPixel(ComponentSampleModel.java:750)
	at java.awt.image.Raster.getPixel(Raster.java:1519)
	at net.semanticmetadata.lire.imageanalysis.features.global.AutoColorCorrelogram.hsvImage(AutoColorCorrelogram.java:230)
	at net.semanticmetadata.lire.imageanalysis.features.global.AutoColorCorrelogram.extract(AutoColorCorrelogram.java:242)
	at net.semanticmetadata.lire.builders.GlobalDocumentBuilder.extractGlobalFeature(GlobalDocumentBuilder.java:199)
	at net.semanticmetadata.lire.builders.GlobalDocumentBuilder.getGlobalDescriptorFields(GlobalDocumentBuilder.java:217)
	at net.semanticmetadata.lire.builders.GlobalDocumentBuilder.createDescriptorFields(GlobalDocumentBuilder.java:265)
	at net.semanticmetadata.lire.builders.GlobalDocumentBuilder.createDocument(GlobalDocumentBuilder.java:287)
	at net.semanticmetadata.lire.sampleapp.Indexer.main(Indexer.java:121)

還得把RGBA轉成RGB格式。

試了下面的方法:

1,python 的pillow庫,有損;

2,imageMagick(http://www.imagemagick.org/script/index.php),有損;

最後找到了這個:https://github.com/dermotte/LIRE/blob/master/src/main/docs/developer-docs/docs/imageread.md

也就是使用imageJ這個庫

    <!-- https://mvnrepository.com/artifact/net.imagej/ij -->
    <dependency>
      <groupId>net.imagej</groupId>
      <artifactId>ij</artifactId>
      <version>1.49c</version>
    </dependency>

程式碼:

package com.liyao;

import ij.ImagePlus;
import ij.process.ImageConverter;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class RGBConvert {
    public static void main(String args[]){
        BufferedImage oldRGBA = openImage("src/main/resources/whatsapp.png");
        File outputfile = new File("E:\\saved.png");
        try {
            ImageIO.write(oldRGBA, "png", outputfile);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static BufferedImage openImage(String path) {
        ImagePlus imgPlus = new ImagePlus(path);
        // converting the image to RGB
        ImageConverter imageConverter = new ImageConverter(imgPlus);
        imageConverter.convertToRGB();
        // returning the BufferedImage instance
        return imgPlus.getBufferedImage();
    }
}

親測無損。下面是結果:

這是RGBA 的圖片:

我的cbir系統無法處理。

下面是使用python處理以後的RGB:

程式碼:

import PIL.Image as Image

rgba_image = Image.open('wechat.png')
rgba_image.save('new.png')

這個圖片會報之前的錯。

下面是使用imageJ處理以後的RGB:


沒有報錯。