Java 确定以前从单个图像缝合到的图像数量时出现的问题
我需要从一张之前缝合在一起的图像中提取单个图像,并对其进行处理。例如,将四个独立的图像缝合以生成一个图像,如下所示: 作为图像处理新手,我做了一些研究,发现适合我的要求 这是我到目前为止写的: 图像提取和处理Java 确定以前从单个图像缝合到的图像数量时出现的问题,java,image,image-processing,jai,Java,Image,Image Processing,Jai,我需要从一张之前缝合在一起的图像中提取单个图像,并对其进行处理。例如,将四个独立的图像缝合以生成一个图像,如下所示: 作为图像处理新手,我做了一些研究,发现适合我的要求 这是我到目前为止写的: 图像提取和处理 ImageInputStream oldImage = ImageIO .createImageInputStream(new FileInputStream("Four_Image_Stitched.jpeg")); ImageReader image
ImageInputStream oldImage = ImageIO
.createImageInputStream(new FileInputStream("Four_Image_Stitched.jpeg"));
ImageReader imageReader = getImageReader(imageFormat);
imageReader.setInput(oldImage);
int nosOfImages = imageReader.getNumImages(true);
System.out.println("Number of Images = " + nosOfImages);
if (nosOfImages > 1) {
for (int i = 0; i < nosOfImages; i++) {
BufferedImage image = imageReader.read(i);
// do some processing
}
}
这里的问题是imageReader.getNumImages(true)
总是为每种格式返回1
,而与缝合图像的数量无关;我想这应该是缝合的图像的实际数量,特别是在上述示例中的4
我不确定我到底错过了什么
在这方面的任何帮助或建议都将不胜感激
p.S.:缝合到单个图像中的图像数量是未知的,即单个图像可能包含
n
缝合图像的数量,每个图像具有不同的尺寸。您似乎认为粘贴的图像以某种方式分别存储在完整图像中?事实并非如此(几乎可以肯定),一旦(比如)将四幅图像粘贴到一幅图像中并保存,您就拥有了一幅图像——像素矩阵——并且您无法判断它是由N幅图像组成的,除非您使用一些图像处理启发式算法来检测颜色的突然变化,等等。getNumImages()
如果仅适用于某些允许多个子图像的特殊图像格式,如文本文档中的“页面”;通常它们是动画中的帧
在这样一个简单的例子中,一个简单的边缘检测器就足够了。您似乎认为粘贴的图像以某种方式单独存储在完整图像中?事实并非如此(几乎可以肯定),一旦(比如)将四幅图像粘贴到一幅图像中并保存,您就拥有了一幅图像——像素矩阵——并且您无法判断它是由N幅图像组成的,除非您使用一些图像处理启发式算法来检测颜色的突然变化,等等。
getNumImages()
如果仅适用于某些允许多个子图像的特殊图像格式,如文本文档中的“页面”;通常它们是动画中的帧
在这样一个简单的例子中,一个简单的边缘检测器就足够了。我很确定这不是
getNumImages
的目的。我相信它适用于有多个图像(如动画GIF)的格式,而不是有一个以前由零件组装而成的图像。我想你能识别这些的唯一方法就是找到具有突然颜色转换的矩形。@Javabond:对不起,我不能,我从来没有做过任何重要的图像处理。祝你好运,我相当肯定这不是getNumImages
的目的。我相信它适用于有多个图像(如动画GIF)的格式,而不是有一个以前由零件组装而成的图像。我想你能识别这些的唯一方法就是找到具有突然颜色转换的矩形。@Javabond:对不起,我不能,我从来没有做过任何重要的图像处理。祝你好运
private ImageReader getImageReader(String imageFormat) {
if ("PNG".equalsIgnoreCase(imageFormat)) {
return new PNGImageReader(new PNGImageReaderSpi());
}
if ("JPEG".equalsIgnoreCase(imageFormat)) {
return new JPEGImageReader(new JPEGImageReaderSpi());
}
if ("GIF".equalsIgnoreCase(imageFormat)) {
return new GIFImageReader(new GIFImageReaderSpi());
}
if ("BMP".equalsIgnoreCase(imageFormat)) {
return new BMPImageReader(new BMPImageReaderSpi());
}
return null;
}