java - 如何在 Java 中向多页 Tiff 添加文本并保持图像比例?

标签 java text addition tiff

尝试将文本添加到多页(多图像)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();
}

最佳答案

以下代码不一致:

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() 的调用?

关于java - 如何在 Java 中向多页 Tiff 添加文本并保持图像比例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14946178/

相关文章:

python - 使用 pandas 删除停用词

Java/数据库查询: Retrieving multiple items

java - Java中为什么数字运算的结果与变量运算的结果不同

java - 为java应用程序分配更多内存

linux - 根据从文本文件中获取的模式将文本文件拆分为多个部分

javascript - 如何修复文本以使其显示在一行上?

java - 为什么我无法更新sqlite数据库的值

java - 添加方法中的值

JavaScript - 如何添加 2 个图像的 alpha 以使结果 alpha = 1?

java - Spring Boot获取@Configuration类的环境变量