Tag: jai

在java中缩放多页TIFF图像

我想更改多页TIFF图像的高度,所以我使用下面的代码片段来缩放它。 但它只从tiff文件返回第一页,我想它会将其转换为JPEG图像。 如何保留文件的所有页面? public static byte[] scale(byte[] fileData, int width, int height) { System.out.println(“width:::”+width+”::::height:::”+height); ByteArrayInputStream in = new ByteArrayInputStream(fileData); ByteArrayOutputStream buffer=null; BufferedImage img=null; BufferedImage imageBuff=null; try { ImageInputStream imageStream = ImageIO.createImageInputStream(new ByteArrayInputStream(fileData)); java.util.Iterator readers = ImageIO.getImageReaders(imageStream); while(readers.hasNext()) { ImageReader nextImageReader = readers.next(); nextImageReader.reset(); } img = ImageIO.read(in); if(height == 0) { height = (width * […]

JAI:如何从多页TIFF图像容器中提取单页输入流?

我有一个组件可以将PDF文档转换为图像, 每页一个图像 。 由于组件使用转换器生成内存中的映像,因此它会严重影响JVM堆并需要一些时间来完成转换。 我正在尝试提高转换过程的整体性能,并找到了一个带有JNI绑定的本机库,可以将PDF转换为TIFF。 该库只能将PDF转换为单个TIFF文件(需要中间文件系统存储;甚至不使用转换流),因此结果TIFF文件已嵌入转换页面,而不是文件系统上的每页图像。 拥有一个本地库可以极大地改善整体转换并且性能变得非常快,但是存在一个真正的瓶颈:因为我必须将源页面转换为目标页面转换,现在我必须从结果文件中提取每个页面并写入其他所有人。 一个简单而天真的RenderedImage方法: final SeekableStream seekableStream = new FileSeekableStream(tempFile); final ImageDecoder imageDecoder = createImageDecoder(“tiff”, seekableStream, null); … // V— heap is wasted here final RenderedImage renderedImage = imageDecoder.decodeAsRenderedImage(pageNumber); // … do the rest stuff … 实际上,我真的只想从TIFF容器文件( tempFile )中提取具体的页面输入流,并将其重定向到其他地方,而不必将其存储为内存中的图像。 我想象一种类似于容器处理的方法,我需要寻找一个特定的条目来从中提取数据(比如像ZIP文件处理等)。 但是我在ImageDecoder找不到类似的ImageDecoder ,或者我可能错了我的期望,只是错过了一些重要的东西…… 是否可以使用JAI API或可能的第三方替代方案提取TIFF容器页面输入流? 提前致谢。

Java Advanced Imaging API中的Fast Perspective转换

为了我的程序的需要,我创建了一个设备来扭曲图像并将其放在地图上(我的程序是基于地图的程序)。 我编写了自己的机制,使用放置在图像上的三个点放置和扭曲图像,放置在地图上的三个点,然后我只是创建一个AffineTransform,将第一个三角形转换为第二个,实际上将图像准确放置在我想要的位置并进行转换以适合用户的需求。 问题是,使用AffineTransforms,您只能执行最基本的转换。 您可以翻译,旋转,缩放和倾斜图像。 这对于大多数情况来说已经足够了,但我最近想要实现类似于Photoshop的自由变换的4点变换。 我做了一些研究,发现了JAI的Perspective变换,在WarpPerspective的帮助下,我可以实现我想要的。 我最初有一个问题,即变换图像的结果背景是透明的,但我也找到了解决方案。 这是我的代码: package com.hampton.utils; import java.awt.Dimension; import java.awt.RenderingHints; import java.awt.Transparency; import java.awt.color.ColorSpace; import java.awt.image.ColorModel; import java.awt.image.DataBuffer; import java.awt.image.SampleModel; import java.awt.image.renderable.ParameterBlock; import javax.media.jai.ImageLayout; import javax.media.jai.Interpolation; import javax.media.jai.JAI; import javax.media.jai.PerspectiveTransform; import javax.media.jai.PlanarImage; import javax.media.jai.RasterFactory; import javax.media.jai.RenderedOp; import javax.media.jai.WarpPerspective; import javax.media.jai.operator.CompositeDescriptor; /** * @author Savvas Dalkitsis */ public class PerspectiveTransformation { public […]

检查文件是否是图像

我正在使用JAI并创建一个文件: PlanarImage img = JAI.create(“fileload”, myFilename); 如果文件存在,我在该行之前检查。 但是我如何检查文件是.bmp还是.tiff或图像文件? 有人知道吗?

如何在Java中设置icc颜色配置文件并更改颜色空间

首先,我想说我不是图像处理专家。 我想将图像颜色空间从一个转换为另一个,并同时更改icc颜色配置文件。 我设法使用JMagick(ImageMagick Java端口),但纯Java(甚至使用JAI)也没办法。

使用JAI将swing组件写入大TIFF图像

我有一个大的swing组件写入TIFF。 组件太大而无法在内存中加载TIFF,因此我需要制作一个大的BufferedImage,它由基于磁盘的WritableRaster(如此处所述)支持或使用JAI。 除了项目的完全混乱之外,JAI似乎是更好的答案。 鉴于此,有人可以概述将我的swing组件写入平铺TIFF而不会耗尽内存的步骤吗? 图像大小可能是10000×700 理想情况下,我会创建某种基于磁盘的映像,并将组件的一部分写入其中,每次写入都会刷新到磁盘。 编辑 我想我可以用ImageWriter做到这一点,但是当我调用时,我得到一个NoSuchElementException: ImageWriter imageWriter = ImageIO.getImageWritersByFormatName(“tif”).next(); 我的classpath上有jai_code.jar和jai_core.jarjar子,还有什么我需要做的吗? 编辑我可以使用JAI创建一个非常大的TIFF,但JAI不支持TIFF压缩,因此文件是92 MB。 如果我安装JAI-ImageIO,我可以使用ImageWriter创建一个压缩的TIFF,但只能使用Raster或BufferedImage,而我没有足够的内存。 有没有办法做两步法,使用JAI创建大TIFF,然后压缩大TIFF而不将整个内容加载到内存中?

如何在JAVA中将两个或多个tiff图像文件合并到一个多页tiff图像中

我有5个单页tiff图像。 我想将所有这5个tiff图像组合成一个多页tiff图像。 我正在使用Java Advanced Imaging API。 我已经阅读了SUN提供的JAI API文档和教程。 我是JAI的新手。 我知道基本的核心java。 我不理解SUN的那些文档和文化。 所以朋友请告诉我如何将5个tiff图像文件合并到一个多页tiff图像中。 请给我一些关于上述主题的指导。 我一直在寻找互联网上面的主题,但没有得到任何一个线索。 所以请指导我的朋友们。 提前致谢。

将PNG转换为JPEG

我在将简单的PNG转换为JPEG格式时遇到问题。 我正在使用以下代码: … File png = new File(filePath); try { SeekableStream s = new FileSeekableStream(png); PNGDecodeParam pngParams = new PNGDecodeParam(); ImageDecoder dec = ImageCodec.createImageDecoder(“png”, s, pngParams); RenderedImage pngImage = dec.decodeAsRenderedImage(); JPEGEncodeParam jparam = new JPEGEncodeParam(); jparam.setQuality(0.50f); // eg 0.25f File jpeg = new File(“jpeg.jpeg”); FileOutputStream out = new FileOutputStream(jpeg); ImageEncoder encoder = ImageCodec.createImageEncoder(“JPEG”, out, jparam); […]

从Java中的非常大的图像文件中读取区域

是否有一个Java库可以读取非常大的图像(例如JPEG)文件(> 10,000 x 10,000像素)的区域,而不会将整个图像保留在内存中。 或者,哪个Java库能够以最小的开销处理非常大的图像文件。

如何实现jpeg无损?

如何在Java中实现jpeg-lossess? ImageWriter writer = (ImageWriter) ImageIO.getImageWritersByFormatName(“JPEG-LS”).next(); ImageWriteParam param = writer.getDefaultWriteParam(); param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); param.setCompressionType(“JPEG-LS”); writer.setOutput(ImageIO.createImageOutputStream(new File(“C:\\Users\\RileyRen\\Desktop\\123.jpg”))); writer.write(null, new IIOImage(subBufferedImage, null, null), param); 会抛出exception: Exception in thread “main” java.lang.IllegalArgumentException: Unknown compression type! at javax.imageio.ImageWriteParam.setCompressionType(ImageWriteParam.java:1041) at com.demandforce.ImageCrop.main(ImageCrop.java:59) param.getCompressionTypes()仅打印[JPEG] 。 使用JAI (版本1.1.3): PlanarImage input = JAI.create(“fileload”, “C:\\Users\\RileyRen\\Desktop\\test.jpg”); ParameterBlock pb = new ParameterBlock(); pb.addSource(input); pb.add(x); pb.add(y); pb.add(width); pb.add(height); PlanarImage output = […]