在 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();
}
我不确定我到底在做什么,所以请给一些建议并原谅错误。
我有一个名为 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();
}