java - 将 Tif 图像转换为 byte[]

标签 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(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 在 java 1.8 中始终为 null,但 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。 built-in formats包括 BMP、GIF、JPEG、PNG 和 WBMP。要读取或写入 TIFF,您可以使用 JAI (jai_imageio.jar),TwelveMonkeys ImageIO或类似的。

如果没有合适的插件,ImageIO.read(...) 只会返回 null。这是您的 imgnull (并且您收到异常)的最可能原因。您可能在 Java 1.6 JRE 中安装了 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);
}

或者在Java 8中,你可以写得更优雅(感谢@JoopEggen):

File file = new File(dirName, imageName);
byte[] bytes = Files.readAllBytes(file.toPath()); 

关于java - 将 Tif 图像转换为 byte[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31420202/

相关文章:

Java颜色碰撞检测

java - BufferedImage 的 getSubimage() 到底做了什么?

java - Tomcat 启动忽略用于调试的 jpda 选项

java - 在 Java 中,如何写入最近读取的文件?

java - 在哪里放置文件以从java中的包下的类读取?

java - Android 应用程序内部数据存储

java - 区分 WebParam 中的 Null 和空集合

Java 流收集器在 Set::size 上出现 groovy 错误

java - 使用 JAXB 解码 XML 中的属性

java - BufferedImage 有两种类似的方法,一种有效,一种无效。为什么?