Java 将Tif图像转换为字节[]
我试图将Tiff图像转换为Byte[],但从java 1.8 sdk中获得异常。我在谷歌上搜索,但还没有找到答案同样的代码适用于java 1.6Java 将Tif图像转换为字节[],java,file-io,bufferedimage,javax.imageio,Java,File Io,Bufferedimage,Javax.imageio,我试图将Tiff图像转换为Byte[],但从java 1.8 sdk中获得异常。我在谷歌上搜索,但还没有找到答案同样的代码适用于java 1.6 public static byte[] convertImage(String dirName, String imageName) { try { //String dirName="C:\\Temp\\"; ByteArrayOutputStream baos=new ByteArrayOutputStream(1
public static byte[] convertImage(String dirName, String imageName)
{
try
{
//String dirName="C:\\Temp\\";
ByteArrayOutputStream baos=new ByteArrayOutputStream(1000);
BufferedImage img=ImageIO.read(new File(dirName,imageName));
ImageIO.write(img, "tif", baos);
baos.flush();
byte[] bytearray = baos.toByteArray();
baos.close();
return bytearray;
}
catch(IOException ioe)
{
ioe.printStackTrace();
}
catch(Exception ex)
{
ex.printStackTrace();
}
return null;
}
变量img在Java1.8中始终为空,但1.6返回信息
sdk 1.8引发的异常如下
java.lang.IllegalArgumentException: image == null!
at javax.imageio.ImageTypeSpecifier.createFromRenderedImage(Unknown Source)
at javax.imageio.ImageIO.getWriter(Unknown Source)
at javax.imageio.ImageIO.write(Unknown Source)
at test.practice.net.ConverterImageUsing18.convertImage(ConverterImageUsing18.java:88)
at test.practice.net.ConverterImageUsing18.GetBase64BinaryAsString(ConverterImageUsing18.java:52)
at test.practice.net.ConverterImageUsing18.main(ConverterImageUsing18.java:42)
任何点击或示例代码都是可观的 ImageIO需要一个额外的插件来读取或写入TIFF。它们是BMP、GIF、JPEG、PNG和WBMP。要读取或写入TIFF,可以使用JAI(
JAI_imageio.jar
)或类似工具
如果没有合适的插件,ImageIO.read(…)
只返回null
。这是您的img
为null
的最可能原因(您会得到一个异常)。您可能在Java1.6JRE中安装了JAI或类似软件,或者您可能正在使用不同的文件进行测试
但是,如果您只想获取原始文件的字节,则根本不需要使用ImageIO。只需将文件中的字节读入字节数组,例如:
File file = new File(dirName, imageName);
int length = (int) file.length();
byte[] bytes = new byte[length];
try (DataInputStream input = new DataInputStream(new FileInputStream(file))) {
input.readFully(bytes);
}
或者在Java8中,您可以编写得更加优雅(谢谢@JoopEggen):
ImageIO需要一个额外的插件来读取或写入TIFF。它们是BMP、GIF、JPEG、PNG和WBMP。要读取或写入TIFF,可以使用JAI(
JAI_imageio.jar
)或类似工具
如果没有合适的插件,ImageIO.read(…)
只返回null
。这是您的img
为null
的最可能原因(您会得到一个异常)。您可能在Java1.6JRE中安装了JAI或类似软件,或者您可能正在使用不同的文件进行测试
但是,如果您只想获取原始文件的字节,则根本不需要使用ImageIO。只需将文件中的字节读入字节数组,例如:
File file = new File(dirName, imageName);
int length = (int) file.length();
byte[] bytes = new byte[length];
try (DataInputStream input = new DataInputStream(new FileInputStream(file))) {
input.readFully(bytes);
}
或者在Java8中,您可以编写得更加优雅(谢谢@JoopEggen):
如果您知道此操作失败,`BuffereImage img=ImageIO.read(新文件(dirName,imageName));`你为什么还要再费心呢。调试这个。您一定是在某个地方吞咽并出现异常。@Shahzeb No,
ImageIO.read(…)
只返回它无法识别的文件类型的null
。有关更多详细信息,请参阅下面的答案。是的,TIFF是可选的,可能是“TIFF”?如果您知道此操作失败`BuffereImage img=ImageIO.read(新文件(目录名,图像名));`你为什么还要再费心呢。调试这个。您一定是在某个地方吞咽并出现异常。@Shahzeb No,ImageIO.read(…)
只返回它无法识别的文件类型的null
。有关更多详细信息,请参见下面的答案。是的,TIFF是可选的,可能是“TIFF”?现在byte[]bytes=Files.readAllBytes(file.toPath())代码>,但建议不错。谢谢提供信息。但是上面的代码返回字节[]和所有0的值。i、 e.[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,…]。我认为价值不应该都是0。之后,我尝试使用DatatypeConverter.printBase64Binary()方法将该字节数组转换为base64binary字符串,并返回“AAAAA…”值,该值不正确。你还有别的解决办法吗?我还没有尝试使用JAI。我将尝试使用JAI转换Tif图像。@Morshed否,如果原始文件包含所有0
s,则它应仅包含所有0
s。你确定你有正确的密码吗?上面的代码适合我。在我看来,您似乎遗漏了一些代码(可读(字节)
部分)。PS:稍微修改了代码,以便在Java<8时看起来更好。但是它的工作原理是一样的代码>,但建议不错。谢谢提供信息。但是上面的代码返回字节[]和所有0的值。i、 e.[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,…]。我认为价值不应该都是0。之后,我尝试使用DatatypeConverter.printBase64Binary()方法将该字节数组转换为base64binary字符串,并返回“AAAAA…”值,该值不正确。你还有别的解决办法吗?我还没有尝试使用JAI。我将尝试使用JAI转换Tif图像。@Morshed否,如果原始文件包含所有0
s,则它应仅包含所有0
s。你确定你有正确的密码吗?上面的代码适合我。在我看来,您似乎遗漏了一些代码(可读(字节)部分)。PS:稍微修改了代码,以便在Java<8时看起来更好。但它的工作原理是一样的。