java中PNG字节数组到JPEG字节数组的转换

java中PNG字节数组到JPEG字节数组的转换,java,image,png,jpeg,Java,Image,Png,Jpeg,我不确定我到底在做什么,所以请给出一些建议并原谅我的错误 我有一个名为idCardImage的图像byte[],我执行了以下操作将其转换为字符串: String s = new String(idCardImage); 它打印出来如下: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAEHUlEQVQ4TzWUW49VRRCFv6rq3ufMmTNn.... 在网上搜索了一下,这张图片的格式似乎是png

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

我有一个名为
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) 将该字节转换为保存PNG图像的
buffereImage

BufferedImage bufferedImage = ImageIO.read(new ByteArrayInputStream(imageData));
3) 然后,您可以创建单独的BuffereImage,并使用JPG fromat填充它

(此步骤可以通过
ImageIO.write(源、格式、输出)
简化,如中所示)

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

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

您可以使用
ImageIO
作为解释器在java中转换图像。它允许读取图像数据,就像将图像数据写入指定格式一样。它需要一个
InputStream
来读取图像数据。由于您有一个
字节[]
,因此可以轻松创建
ByteArrayInputStream

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

考虑以下示例

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();
}

实际上,这是一个数据uri,恰好包含一个base64编码的png图像。@Pshemo我确实看到了那个链接,但我没有任何jpg文件,我只有一个字节数组。@MarcB我想你是对的,如果我错了,请纠正我,png数据在
base64,
之后,对吗?是的。
iVB…
stuff是base64数据。不知道java是否有一个数据uri解析库(可能有),但如果没有其他功能,您可以简单地使用字符串操作提取b64数据,然后将其加载到b64解码器
ImageIO中。write(source,format,output)
使事情变得简单多了+1我实际上使用的是java 7,所以我替换了
Base64.getDecoder().decode(encodedImage);
DatatypeConverter.parseBase64Binary(encodedImage);
一起工作
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();
}