从FileInputStream转换为Image后,输出图像变为黑色

时间:2014-07-16 10:01:15

标签: java bufferedimage javax.imageio

我正在尝试将两个以FileInputStream形式存在的TIFF图像合并为一个Tiff图像。虽然图像正在合并,但输出文件将显示为黑色。在比较原始图像和转换后的图像时,我可以看到转换后的图像的位深度变为1.有人可以为此提供解决方案吗? 我正在使用的代码是:

public class MergerTiffUsingBuffer {

    public static void main(String[] args) {

        File imageFile1 = new File("D:/Software/pdfbox-1.3.1.jar/tiff/FLAG_T24.TIF");
        File imageFile2 = new File("D:/Software/pdfbox-1.3.1.jar/tiff/CCITT_3.TIF");
        try {
            FileInputStream fis1 = new FileInputStream(imageFile1);
            FileInputStream fis2 = new FileInputStream(imageFile2);
            List<BufferedImage> bufferedImages=new ArrayList<>();
            List<FileInputStream> inputStreams=new ArrayList<>();
            inputStreams.add(fis1);
            inputStreams.add(fis2);
            Iterator<?> readers = ImageIO.getImageReadersByFormatName("tiff");
            ImageReader reader = (ImageReader) readers.next();

            for(FileInputStream inputStream:inputStreams){
                ImageInputStream iis = ImageIO.createImageInputStream(inputStream);
                reader.setInput(iis);
                ImageReadParam param = reader.getDefaultReadParam();
                Image image = reader.read(0, param);

                BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB);
                OutputStream out = new FileOutputStream("D:/Software/pdfbox-1.3.1.jar/tiff/MergedTiff.TIF");
                BufferedImage binarized = new BufferedImage(bufferedImage.getWidth(), bufferedImage.getHeight(),BufferedImage.TYPE_BYTE_BINARY);
                ImageIO.write(binarized, "tiff", out);
                bufferedImages.add(bufferedImage);
            }
            System.out.println(bufferedImages.size());
        } catch (IOException e2) {
            e2.printStackTrace();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您似乎对如何复制图像数据感到困惑。只需通过传递另一个图像的尺寸来创建一个新的空白图像,就不会复制它......因此,在运行代码后,我会发现全黑图像。

用以下内容替换你的for循环:

for (FileInputStream inputStream : inputStreams) {
    ImageInputStream iis = ImageIO.createImageInputStream(inputStream);
    reader.setInput(iis);

    BufferedImage image = reader.read(0, null); // a) BufferedImage is returned! b) null param is fine!

    BufferedImage binarized = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_BINARY);

    // The following 7 lines is the important part you were missing:
    Graphics2D g = binarized.createGraphics();
    try {
        g.drawImage(image, 0, 0, null);
    }
    finally {
        g.dispose();
    }

    OutputStream out = new FileOutputStream("D:/Software/pdfbox-1.3.1.jar/tiff/MergedTiff.TIF");

    ImageIO.write(binarized, "tiff", out); // You probably want to check return value (true/false)!

    bufferedImages.add(image);
}