在 java 中将 PNG 字节数组转换为 JPEG 字节数组

Converting PNG byte array to JPEG byte array in java

我不确定我到底在做什么,所以请给一些建议并原谅错误。

我有一个名为 idCardImage 的图像 byte[],我执行以下操作将其转换为字符串:

String s = new String(idCardImage);

打印出来是这样的:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAEHUlEQVQ4TzWUW49VRRCFv6rq3ufMmTNn....

在网上搜索了一下,这张图片似乎是 png 格式,采用 base 64 编码。

我需要做的是将其转换为jpeg格式,然后将其存储在一个新的字节数组中。你能就如何用 Java 做一些建议吗?

我不确定这是否是最有效的方法,但您可以:

1) 将该字符串中的数据转换为表示图像的字节,例如:

String dataUrl = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAEHUlEQVQ4TzWUW49VRRCFv6rq3ufMmTNn...";
String header = "data:image/png;base64";

String encodedImage = dataUrl.substring(header.length()+1); //+1 to include comma 
byte[] imageData = Base64.getDecoder().decode(encodedImage); //decode bytes

2) 将该字节转换为 BufferedImage 保存 PNG 图像

BufferedImage bufferedImage = ImageIO.read(new ByteArrayInputStream(imageData));

3) 然后基于 http://www.mkyong.com/java/convert-png-to-jpeg-image-file-in-java/ 您可以创建单独的 BufferedImage 并使用来自

的 JPG 填充它
 // create a blank, RGB, same width and height, and a white background
 BufferedImage newBufferedImage = new BufferedImage(bufferedImage.getWidth(),
        bufferedImage.getHeight(), BufferedImage.TYPE_INT_RGB);
 newBufferedImage.createGraphics().drawImage(bufferedImage, 0, 0, Color.WHITE, null);

(这一步可以用ImageIO.write(source, format, output)简化,如图

4) 最后我们可以在 ByteArrayOutputStream

的帮助下将这些字节写入单独的字节数组
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(newBufferedImage, "jpg",baos);
byte[] byteArray = baos.toByteArray();

您可以使用ImageIO作为解释器来转换java中的图像。它允许读取图像数据,就像将图像数据写入指定格式一样。它需要一个 InputStream 来读取图像数据。因为你有一个 byte[] 你可以很容易地创建一个 ByteArrayInputStream

ImageIO 需要 OutputStream 才能写入字节数据。而且 ByteArrayOutputStream 允许提取它的 byte[]。所以你可以将图像字节写入 ByteArrayOutputStream 和 return 它的字节。

考虑以下示例

public byte[] pngBytesToJpgBytes(byte[] pngBytes) throws IOException {
    //create InputStream for ImageIO using png byte[]
    ByteArrayInputStream bais = new ByteArrayInputStream(pngBytes);
    //read png bytes as an image
    BufferedImage bufferedImage = ImageIO.read(bais);
    //create OutputStream to write prepaired jpg bytes
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    //write image as jpg bytes
    ImageIO.write(bufferedImage, "JPG", baos);
    //convert OutputStream to a byte[]
    return baos.toByteArray();
}