Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将Tif图像转换为字节[]_Java_File Io_Bufferedimage_Javax.imageio - Fatal编程技术网

Java 将Tif图像转换为字节[]

Java 将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

我试图将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(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时看起来更好。但它的工作原理是一样的。