图像文件写入的大小是实际大小的两倍

问题描述

我正在尝试读取多页tiff并涂黑某些内容,然后再次写入。

代码:-

public void blackOut(File file,File outputTiff,String compressionType) throws IOException
    {
        ImageReader reader = getimageReader(file);
        int pageCount = reader.getNumImages(true);

        Iterator<ImageWriter> writers = ImageIO.getimageWritersByFormatName(TIFF_FORMAT);
        if (!writers.hasNext())
        {
            throw new RuntimeException(JAI_IMAGE_WRITER_MESSAGE);
        }
        ImageWriter writer = writers.next();

        TIFFImageWriteParam tiffWriteParam = new TIFFImageWriteParam(Locale.US);

        if (compressionType != null)
        {
            tiffWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
            tiffWriteParam.setCompressionType(compressionType);
        }

        IIOMetadata streamMetadata = writer.getDefaultStreamMetadata(tiffWriteParam);

        try (ImageOutputStream ios = ImageIO.createImageOutputStream(outputTiff))
        {
            writer.setoutput(ios);

            int dpiX = 300;
            int dpiY = 300;

            for (int i = 0; i < pageCount; i++)
            {
                BufferedImage bufferedImage = reader.read(i);

                Graphics2D g2d = bufferedImage.createGraphics();
                g2d.setColor(Color.BLACK);
                g2d.setstroke(new Basicstroke(10));
                g2d.fillRect(X,Y,Width,Height);
                g2d.dispose();

                IIOImage iioImage = new IIOImage(bufferedImage,null,null);

                Imagetypespecifier imageType = Imagetypespecifier.createFromrenderedImage(iioImage.getRenderedImage());
                ImageWriteParam param = writer.getDefaultWriteparam();
                IIOMetadata imageMetadata = writer.getDefaultimageMetadata(imageType,param);
                imageMetadata = setDPIViaAPI(imageMetadata,dpiX,dpiY);
                iioImage.setMetadata(imageMetadata);

                if (i == 0)
                {
                    IIOImage firstIioImage = iioImage;
                    writer.write(streamMetadata,firstIioImage,tiffWriteParam);
                }
                else
                {
                    writer.writeInsert(i,iioImage,tiffWriteParam);
                }
            }
        }
        finally
        {
            writer.dispose();
        }

    }

private static IIOMetadata setDPIViaAPI(IIOMetadata imageMetadata,int dpiX,int dpiY)
            throws IIOInvalidTreeException
    {
        // Derive the TIFFDirectory from the Metadata.
        TIFFDirectory dir = TIFFDirectory.createFromMetadata(imageMetadata);

        // Get {X,Y}Resolution tags.
        BaselineTIFFTagSet base = BaselineTIFFTagSet.getInstance();
        TIFFTag tagXRes = base.getTag(BaselineTIFFTagSet.TAG_X_RESOLUTION);
        TIFFTag tagYRes = base.getTag(BaselineTIFFTagSet.TAG_Y_RESOLUTION);

        // Create {X,Y}Resolution fields.
        TIFFField fieldXRes = new TIFFField(tagXRes,TIFFTag.TIFF_RATIONAL,1,new long[][] {{dpiX,1}});
        TIFFField fieldYRes = new TIFFField(tagYRes,new long[][] {{dpiY,1}});

        // Append {X,Y}Resolution fields to directory.
        dir.addTIFFField(fieldXRes);
        dir.addTIFFField(fieldYRes);

        // Convert to Metadata object.
        IIOMetadata Metadata = dir.getAsMetadata();

        // Add other Metadata.
        IIOMetadatanode root = new IIOMetadatanode("javax_imageio_1.0");
        IIOMetadatanode horiz = new IIOMetadatanode("HorizontalPixelSize");
        horiz.setAttribute("value",Double.toString(25.4f / dpiX));
        IIOMetadatanode vert = new IIOMetadatanode("VerticalPixelSize");
        vert.setAttribute("value",Double.toString(25.4f / dpiY));
        IIOMetadatanode dim = new IIOMetadatanode("Dimension");
        dim.appendChild(horiz);
        dim.appendChild(vert);
        root.appendChild(dim);
        Metadata.mergeTree("javax_imageio_1.0",root);

        return Metadata;
    }

在再次写入文件时,我得到的文件大小是实际大小的两倍(有时是三倍),而在应用压缩“ LZW”之后也是如此。

通过任何方式可以获得与以前相同的文件大小?

谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...