问题描述
我正在尝试读取多页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 (将#修改为@)