为什么读一个bmp的字节数组,宽高丢了
why read a byte array of bmp and the width and height lost
我的服务器通过上传接收到一个bmp的字节数组,我读取它的宽高却得到-1
。我尝试用下面的代码模拟这个上传案例:
public class ImageReader {
private static URL imgUrl;
public static void main(String[] args) throws IOException {
imgUrl = ImageReader.class.getResource("myimage.jpg");
printWidthHeight(imgUrl, "jpg");
imgUrl = ImageReader.class.getResource("flag.bmp");
printWidthHeight(imgUrl, "bmp");
}
private static void printWidthHeight(URL imgUrl, String format) throws IOException {
BufferedImage image = ImageIO.read(imgUrl);
System.out.println(image.getType());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
boolean isAppropriate = ImageIO.write(image, format, baos);
System.out.println(isAppropriate);
byte[] bytes = baos.toByteArray();
ImageIcon imageIcon = new ImageIcon(bytes);
System.out.format( "%s, %s \n", imageIcon.getIconWidth(), imageIcon.getIconHeight());
}
}
它打印:
5
true
171, 125
5
true
-1, -1
我找到了
- jpg 仍然有宽度和高度,但 bmp 没有
有谁知道原因吗?
根据Java文档,ImageIcon不支持BMP格式:
您可以使用这个:
Get Image Dimension and Image Size from Binary
感谢您的提示。我发现如果我用 ImageIO
读取这些字节,我可以成功获取图像的宽度和高度。
public class ImageReader {
private static URL imgUrl;
private static byte[] bytes;
public static void main(String[] args) throws IOException {
imgUrl = ImageReader.class.getResource("myimage.jpg");
bytes = getBytes(imgUrl, "jpg");
printWidthHeight(bytes);
imgUrl = ImageReader.class.getResource("flag.bmp");
bytes = getBytes(imgUrl, "bmp");
printWidthHeight(bytes);
}
private static void printWidthHeight(byte[] bytes) throws IOException {
ImageIcon imageIcon = new ImageIcon(bytes);
System.out.format( "%s, %s \n", imageIcon.getIconWidth(), imageIcon.getIconHeight());
BufferedImage image = ImageIO.read(new ByteArrayInputStream(bytes));
ImageIcon imageIcon2 = new ImageIcon(image);
System.out.format( "%s, %s \n", imageIcon2.getIconWidth(), imageIcon2.getIconHeight());
}
private static byte[] getBytes(URL imgUrl, String format) throws IOException {
BufferedImage image = ImageIO.read(imgUrl);
System.out.println(image.getType());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
boolean isAppropriate = ImageIO.write(image, format, baos);
System.out.println(isAppropriate);
byte[] bytes = baos.toByteArray();
return bytes;
}
}
输出
5
true
171, 125
171, 125
5
true
-1, -1
124, 124
我的服务器通过上传接收到一个bmp的字节数组,我读取它的宽高却得到-1
。我尝试用下面的代码模拟这个上传案例:
public class ImageReader {
private static URL imgUrl;
public static void main(String[] args) throws IOException {
imgUrl = ImageReader.class.getResource("myimage.jpg");
printWidthHeight(imgUrl, "jpg");
imgUrl = ImageReader.class.getResource("flag.bmp");
printWidthHeight(imgUrl, "bmp");
}
private static void printWidthHeight(URL imgUrl, String format) throws IOException {
BufferedImage image = ImageIO.read(imgUrl);
System.out.println(image.getType());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
boolean isAppropriate = ImageIO.write(image, format, baos);
System.out.println(isAppropriate);
byte[] bytes = baos.toByteArray();
ImageIcon imageIcon = new ImageIcon(bytes);
System.out.format( "%s, %s \n", imageIcon.getIconWidth(), imageIcon.getIconHeight());
}
}
它打印:
5
true
171, 125
5
true
-1, -1
我找到了
- jpg 仍然有宽度和高度,但 bmp 没有
有谁知道原因吗?
根据Java文档,ImageIcon不支持BMP格式:
您可以使用这个: Get Image Dimension and Image Size from Binary
感谢您的提示。我发现如果我用 ImageIO
读取这些字节,我可以成功获取图像的宽度和高度。
public class ImageReader {
private static URL imgUrl;
private static byte[] bytes;
public static void main(String[] args) throws IOException {
imgUrl = ImageReader.class.getResource("myimage.jpg");
bytes = getBytes(imgUrl, "jpg");
printWidthHeight(bytes);
imgUrl = ImageReader.class.getResource("flag.bmp");
bytes = getBytes(imgUrl, "bmp");
printWidthHeight(bytes);
}
private static void printWidthHeight(byte[] bytes) throws IOException {
ImageIcon imageIcon = new ImageIcon(bytes);
System.out.format( "%s, %s \n", imageIcon.getIconWidth(), imageIcon.getIconHeight());
BufferedImage image = ImageIO.read(new ByteArrayInputStream(bytes));
ImageIcon imageIcon2 = new ImageIcon(image);
System.out.format( "%s, %s \n", imageIcon2.getIconWidth(), imageIcon2.getIconHeight());
}
private static byte[] getBytes(URL imgUrl, String format) throws IOException {
BufferedImage image = ImageIO.read(imgUrl);
System.out.println(image.getType());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
boolean isAppropriate = ImageIO.write(image, format, baos);
System.out.println(isAppropriate);
byte[] bytes = baos.toByteArray();
return bytes;
}
}
输出
5
true
171, 125
171, 125
5
true
-1, -1
124, 124