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

时间:2015-09-29 18:14:40

标签: java image png jpeg

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

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

String s = new String(idCardImage);

它打印出来像这样:

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

在网上进行了一些搜索,看起来这张图片采用png格式,基本编码为64。

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

2 个答案:

答案 0 :(得分:6)

您可以使用RewriteRule ^api/v2.2/?$ /api/api.php [NC,L] 作为解释器来转换java中的图像。它允许读取图像数据,就像将图像数据写入指定格式一样。它需要ImageIO才能读取图像数据。由于您有InputStream,因此您可以轻松创建byte[]

ByteArrayInputStream需要ImageIO来写字节数据。而OutputStream也允许提取它ByteArrayOutputStream。因此,您可以将图像字节写入byte[]并返回其字节。

请考虑以下示例

ByteArrayOutputStream

答案 1 :(得分:2)

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

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 fromat填充它

 // 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)简化,如@Channa Jayamuni answer

4)最后我们可以在ByteArrayOutputStream的帮助下将这些字节写入单独的字节数组

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(newBufferedImage, "jpg",baos);
byte[] byteArray = baos.toByteArray();