【问题标题】:How do I add text to a multi-paged Tiff in Java and maintain image scale?如何在 Java 中将文本添加到多页 Tiff 并保持图像比例?
【发布时间】:2013-02-18 22:07:26
【问题描述】:

尝试将文本添加到多页(多图像)tiff 文件。

为了使过程文本被正确添加,但创建的图像不等于原始缩放(缩放)内容的变化。我不知道如何使它等于原始图像。

这是我使用的代码:

File file = new File("AA005E57.tif");                           
SeekableStream seekableStream = new FileSeekableStream(file);          
BufferedImage bsrc = ImageIO.read(file);          

ImageDecoder decoder = ImageCodec.createImageDecoder("tiff", seekableStream, null);
int numPages = decoder.getNumPages();
BufferedImage image[]= new BufferedImage[numPages];        
for(int i=0;i<decoder.getNumPages();i++){
    PlanarImage op1 =    new NullOpImage(decoder.decodeAsRenderedImage(i), null, null, OpImage.OP_IO_BOUND);

    BufferedImage pg1 = convertRenderedImage(op1);// (new BufferedImage(op1.getWidth(), op1.getHeight(),BufferedImage.TYPE_BYTE_BINARY));
    image[i] = pg1;
    Graphics2D g2 = image[i].createGraphics();
    float pageWidthInch = image[i].getWidth() * 72 / 200;
    float pageHeightInch = image[i].getHeight() * 72 / 100;
    g2.scale(pageWidthInch, pageHeightInch);
    if (i == 0 ){
        Font font = new Font("Helvetica", Font.BOLD, 12);
        g2.setColor(Color.black);
        g2.setFont(font);
        g2.drawString("RADICADO 1234567890214365-D", 25,pg1.getHeight()-25);
    }

    g2.drawImage(image[i], (image[i].getWidth()),image[i].getHeight() ,null);

    g2.dispose();
}
save(image,"C:/Prueb-18.tif");

convertRenderedImage 的代码:

if (img instanceof BufferedImage) {
    return (BufferedImage)img;  
}   

ColorModel cm = img.getColorModel();

float pageWidthInch = img.getWidth() * 72 / 200;
float pageHeightInch = img.getHeight() * 72 / 100;

WritableRaster raster = cm.createCompatibleWritableRaster( (int)pageWidthInch,(int)pageHeightInch);
boolean isAlphaPremultiplied = cm.isAlphaPremultiplied();
Hashtable properties = new Hashtable();
String[] keys = img.getPropertyNames();
if (keys!=null) {
    for (int i = 0; i < keys.length; i++) {
        properties.put(keys[i], img.getProperty(keys[i]));

    }
}
BufferedImage result = new BufferedImage(cm, raster, false, properties);
img.copyData(raster);

return result;

保存方法代码:

Iterator writers = ImageIO.getImageWritersByFormatName("TIFF");

if (writers == null || !writers.hasNext()) {
    throw new RuntimeException("No writers are available.");
}

FileImageOutputStream fios = new FileImageOutputStream(new File(tif));

ImageWriter writer = (ImageWriter) writers.next();
writer.setOutput(fios);
writer.prepareWriteSequence(null);
ImageWriteParam param = writer.getDefaultWriteParam();  
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);  
param.setCompressionType("CCITT T.4");
for (int i = 0; i < b.length; i++) {
    ImageTypeSpecifier imageType = ImageTypeSpecifier.createFromRenderedImage(b[i]);            
    IIOMetadata imageMetadata = writer.getDefaultImageMetadata(imageType, param);
    imageMetadata = createImageMetadata(imageMetadata);
    writer.writeToSequence(new IIOImage(b[i], null, imageMetadata),param);      
}

writer.endWriteSequence();
writer.dispose();
writer = null;
fios.close();

}

createImageMetadata 的代码:

char[] COMPRESSION = new char[] { (char) BaselineTIFFTagSet.COMPRESSION_CCITT_T_4 };
char[] INCH_RESOLUTION_UNIT = new char[] { 2 };
char[] BITS_PER_SAMPLE = new char[] { 1 };
long[][] X_DPI_RESOLUTION = new long[][] { { 200, 1 } };
long[][] Y_DPI_RESOLUTION = new long[][] { { 200, 1 } };

TIFFDirectory ifd = TIFFDirectory.createFromMetadata(imageMetadata);

BaselineTIFFTagSet base = BaselineTIFFTagSet.getInstance();

TIFFTag tagResUnit = base.getTag(BaselineTIFFTagSet.TAG_RESOLUTION_UNIT);
TIFFTag tagXRes = base.getTag(BaselineTIFFTagSet.TAG_X_RESOLUTION);
TIFFTag tagYRes = base.getTag(BaselineTIFFTagSet.TAG_Y_RESOLUTION);

TIFFTag tagBitSample = base.getTag(BaselineTIFFTagSet.TAG_BITS_PER_SAMPLE);

TIFFTag tagRowStrips = base.getTag(BaselineTIFFTagSet.TAG_ROWS_PER_STRIP);

TIFFTag tagCompression = base.getTag(BaselineTIFFTagSet.TAG_COMPRESSION);

TIFFField fieldResUnit = new TIFFField(tagResUnit, TIFFTag.TIFF_SHORT, 1, INCH_RESOLUTION_UNIT);
TIFFField fieldXRes = new TIFFField(tagXRes, TIFFTag.TIFF_RATIONAL, 1, X_DPI_RESOLUTION);
TIFFField fieldYRes = new TIFFField(tagYRes, TIFFTag.TIFF_RATIONAL, 1, Y_DPI_RESOLUTION);
TIFFField fieldBitSample = new TIFFField(tagBitSample, TIFFTag.TIFF_SHORT, 1, BITS_PER_SAMPLE);
TIFFField fieldCompression = new TIFFField(tagCompression, TIFFTag.TIFF_SHORT, 1, COMPRESSION);

ifd.addTIFFField(fieldResUnit);
ifd.addTIFFField(fieldXRes);
ifd.addTIFFField(fieldYRes);
ifd.addTIFFField(fieldBitSample);
ifd.addTIFFField(fieldCompression);
return ifd.getAsMetadata();
}

【问题讨论】:

    标签: java text add tiff


    【解决方案1】:

    以下代码不一致:

    float pageWidthInch = image[i].getWidth() * 72 / 200;
    float pageHeightInch = image[i].getHeight() * 72 / 100;
    

    您的源 DPI 是 200x100 吗?输入一致;选择 100 或 200。这可能是问题的根源,尤其是因为您将两者都保存为 200 以供输出。两者应该是相同的值,除非您的来源使用不同的 DPI 来表示高度和宽度。

    请注意,此代码在您上面提交的代码中出现两次

    如果需要,请在源图像上使用 AsTiffTagViewer(我发现免费应用程序对检查 TIFF 文件非常有用)来确认每个页面的适当值。


    在进一步审查之后,您可以这样做:

    g2.scale(pageWidthInch, pageHeightInch);
    

    您是否考虑过将此电话留给g2.scale()

    【讨论】:

    • 你好,DPI代码去掉它并继续相同,生成的图像不等于原始图像。跟随扭曲。查看 AsTiffTagViewer 的内容。如果您碰巧有任何其他方式将文本添加到保留形状的原始 tif,我将不胜感激。谢谢
    • 使用 AsTiffTagViewer 打开您的源图像。单击每个页面的“将标签复制为文本”。编辑您的原始帖子以包含信息。使用 AsTiffTagViewer 打开生成的图像。单击每个第一页的“将标签复制为文本”。编辑您的原始帖子以包含信息。
    • 这也将帮助我们确认您的原始 TIFF 的规模是多少;有时是厘米。另请注意,我在上面的答案中添加了删除您对 g2.scale() 的调用的建议。请调查。
    • 您要使用 Tiff 标签查看器中的数据更新帖子吗?
    猜你喜欢
    • 1970-01-01
    • 2019-06-14
    • 2012-12-03
    • 1970-01-01
    • 2012-06-11
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多