版权声明:转载时请务必保留以下作者信息和链接
作者:陈维(chenweionline@hotmail.com)作者的网站:http://www.chenwei.mobi
通常我们使用Java 编码输出图像默认的图像分辨率是72dpi(关于图像分辨率可以看我转载的一篇文章《图片分辨率介绍》),PC显示器的设备分辨率一般在60~120dpi之间,而熟悉印刷行业的朋友都知道,印刷一张图像需要的图像分辨率一般是300dpi,就是说这样的图像在显示器上显示可能很细腻但是印刷输出的效果却非常粗糙。那么我们针对印刷或者其他需要高分辨率的应用场合,就需要输出更高分辨率的图像,可是纵观Java SE 中标准的ImageIO 库并没有提供设置DPI值的方法,那么怎么使用Java生成适合印刷或者更高分辨率的图像呢?
幸好,JAI_ImageIO 为我们解决了这个难题,或者只能说部分解决。目前JAI_ImageIO_1.1 对于设置DPI 信息的支持仅限于TIFF格式,我并没有在JAI_ImageIO_1.1 中找到针对其他图像格式(例如常见的JPEG)设置DPI 的方法。
JAI_ImageIO_1.1 中对于的TIFF 格式提供了2种途径(DOM 和 API)可以在图像编码时将DPI 信息设置进Meatadata。下面是一段创建图像并且以300dpi 编码输出的样例程序,它分别就这两种方法都做了实现,可以提供大家学习参考。编译运行需要引用JAI_ImageIO_1.1,可以从https://jai-imageio.dev.java.net/下载。
importcom.sun.media.imageio.plugins.tiff.BaselineTIFFTagSet;
importcom.sun.media.imageio.plugins.tiff.TIFFDirectory;
importcom.sun.media.imageio.plugins.tiff.TIFFField;
importcom.sun.media.imageio.plugins.tiff.TIFFTag;
importjava.awt.image.BufferedImage;
importjava.awt.image.RenderedImage;
importjava.io.File;
importjava.util.Iterator;
importjavax.imageio.IIOImage;
importjavax.imageio.ImageIO;
importjavax.imageio.ImageTypeSpecifier;
importjavax.imageio.ImageWriter;
importjavax.imageio.metadata.IIOInvalidTreeException;
importjavax.imageio.metadata.IIOMetadata;
importjavax.imageio.metadata.IIOMetadataNode;
importjavax.imageio.stream.FileImageOutputStream;
/***//**
*设置自定义dpi值到TIFF格式图像的样例程序。
*需要JAI_ImageIO_1.1提供支持。
*/
publicclassSetDPI4TIFF...{
privatestaticStringMETADATA_NAME="com_sun_media_imageio_plugins_tiff_image_1.0";
privatestaticintDPI_X=300;
privatestaticintDPI_Y=300;
publicstaticvoidmain(String[]args)throwsThrowable...{
//Createsampleimage.
RenderedImageimage=newBufferedImage(256,256,BufferedImage.TYPE_3BYTE_BGR);
//GetTIFFwriter.
Iteratorwriters=ImageIO.getImageWritersByFormatName("TIFF");
if(writers==null||!writers.hasNext())...{
thrownewIllegalStateException("NoTIFFwriters!");
}
ImageWriterwriter=(ImageWriter)writers.next();
//Getthedefaultimagemetadata.
ImageTypeSpecifierimageType=ImageTypeSpecifier.createFromRenderedImage(image);
IIOMetadataimageMetadata=writer.getDefaultImageMetadata(imageType,null);
//SetDPI.
StringfileName;
Stringmethodology;
if(args.length==0||args[0].equalsIgnoreCase("DOM"))...{
fileName="dpi_dom.tif";
setDPIViaDOM(imageMetadata);
methodology="DOM";
}else...{
fileName="dpi_api.tif";
imageMetadata=setDPIViaAPI(imageMetadata);
methodology="API";
}
System.out.println(" Writing"+fileName+"using"+methodology+"methodology ");
//Writeimage.
writer.setOutput(newFileImageOutputStream(newFile(fileName)));
writer.write(newIIOImage(image,null,imageMetadata));
}
/***//**
*SetDPIusingDOMnodes.
*/
privatestaticvoidsetDPIViaDOM(IIOMetadataimageMetadata)throwsIIOInvalidTreeException...{
//GettheDOMtree.
IIOMetadataNoderoot=(IIOMetadataNode)imageMetadata.getAsTree(METADATA_NAME);
//GettheIFD.
IIOMetadataNodeifd=(IIOMetadataNode)root.getElementsByTagName("TIFFIFD").item(0);
//Get{X,Y}Resolutiontags.
BaselineTIFFTagSetbase=BaselineTIFFTagSet.getInstance();
TIFFTagtagXRes=base.getTag(BaselineTIFFTagSet.TAG_X_RESOLUTION);
TIFFTagtagYRes=base.getTag(BaselineTIFFTagSet.TAG_Y_RESOLUTION);
//Create{X,Y}Resolutionnodes.
IIOMetadataNodenodeXRes=createRationalNode(tagXRes.getName(),tagXRes.getNumber(),DPI_X,1);
IIOMetadataNodenodeYRes=createRationalNode(tagYRes.getName(),tagYRes.getNumber(),DPI_Y,1);
//Append{X,Y}ResolutionnodestoIFDnode.
ifd.appendChild(nodeXRes);
ifd.appendChild(nodeYRes);
//Setmetadatafromtree.
imageMetadata.setFromTree(METADATA_NAME,root);
}
/***//**
*CreatesanodeofTIFFdatatypeRATIONAL.
*/
privatestaticIIOMetadataNodecreateRationalNode(StringtagName,inttagNumber,intnumerator,intdenominator)...{
//Createthefieldnodewithtagnameandnumber.
IIOMetadataNodefield=newIIOMetadataNode("TIFFField");
field.setAttribute("name",tagName);
field.setAttribute("number",""+tagNumber);
//CreatetheRATIONALnode.
IIOMetadataNoderational=newIIOMetadataNode("TIFFRational");
rational.setAttribute("value",numerator+"/"+denominator);
//CreatetheRATIONALnodeandappendRATIONALnode.
IIOMetadataNoderationals=newIIOMetadataNode("TIFFRationals");
rationals.appendChild(rational);
//AppendRATIONALSnodetofieldnode.
field.appendChild(rationals);
returnfield;
}
/***//**
*SetDPIusingAPI.
*/
privatestaticIIOMetadatasetDPIViaAPI(IIOMetadataimageMetadata)throwsIIOInvalidTreeException...{
//DerivetheTIFFDirectoryfromthemetadata.
TIFFDirectorydir=TIFFDirectory.createFromMetadata(imageMetadata);
//Get{X,Y}Resolutiontags.
BaselineTIFFTagSetbase=BaselineTIFFTagSet.getInstance();
TIFFTagtagXRes=base.getTag(BaselineTIFFTagSet.TAG_X_RESOLUTION);
TIFFTagtagYRes=base.getTag(BaselineTIFFTagSet.TAG_Y_RESOLUTION);
//Create{X,Y}Resolutionfields.
TIFFFieldfieldXRes=newTIFFField(tagXRes,TIFFTag.TIFF_RATIONAL,1,newlong[][]...{...{DPI_X,1}});
TIFFFieldfieldYRes=newTIFFField(tagYRes,TIFFTag.TIFF_RATIONAL,1,newlong[][]...{...{DPI_Y,1}});
//Append{X,Y}Resolutionfieldstodirectory.
dir.addTIFFField(fieldXRes);
dir.addTIFFField(fieldYRes);
//Converttometadataobjectandreturn.
returndir.getAsMetadata();
}
}
分享到:
相关推荐
基于java的开发源码-图像处理类库 Java Image Filters.zip 基于java的开发源码-图像处理类库 Java Image Filters.zip 基于java的开发源码-图像处理类库 Java Image Filters.zip 基于java的开发源码-图像处理类库 ...
数字图像处理-java编程与实验 数字图像处理-java编程与实验
数字图像处理-java编程与实践
教材《数字图像处理--java语言实现》的电子版本
数字图像处理-java语言算法描述 数字图像处理-java语言算法描述
很好的用java语言图像处理,希望好好使用
数字图像处理 java 语言描述是学习图像处理的基础,对想学习数字图像处理方面的知识,这本电子书对你的帮助会很大。
用Java语言实现对图像的各种处理:图像增强,图像复原,图像编码与压缩,图像分割与描述等
数字图像处理-Java语言算法描述
用JAI扩展Java的图像处理能力 - 中文JAVA技术网用JAI扩展Java的图像处理能力 - 中文JAVA技术网
数字图像处理的Java实现
java图像处理 白色 透明
发给大家共享一下。java图片处理类,课程设计,java图片处理类-java课程设计,java图片处理类-java课程设计,java图片处理类-java课程设计,java图片处理类-java课程设计
数字图像处理教学演示网站-数字图像处理教学演示网站源码-数字图像处理教学演示网站java代码-数字图像处理教学演示项目-数字图像处理教学演示项目代码-数字图像处理教学演示系统-数字图像处理教学演示系统源码-数字...
Java图像处理类库 Java Image Filters
本书一共16章,除第0章介绍Java编程基础外,其余15章对应地编程实现了配套书《数字图像处理—原理与算法》中的所有算法,并进行相应的实验。光盘中有完解的程序代码和和应的实验图像,可直接运行。部分程序源代码...
示例代码展示了如何使用Java的图像处理库来对图像进行灰度化处理。在代码中,我们使用javax.imageio.ImageIO类加载输入图像文件,并创建一个与输入图像具有相同尺寸和类型的输出图像。然后,我们遍历输入图像的每个...
JAVA语言编写的小型数字图像处理程序,包含改变采样率、量化等级,显示直方图、直方图均衡、图像旋转、平滑等基本操作
该方法将使用Java语言编写,并利用Java图形处理库来实现图像处理。 ## 研究背景 随着计算机技术的发展,图形图像处理在各个领域中的应用越来越广泛。在许多领域,如医学、航空航天、安全等领域,图像处理已成为...
用java实现的图像处理,其中包括大部分图像处理的知识,例如灰度图转换,FFT变换,拉普拉斯算子等等