清风的技术小屋

不为所动, 做更专业的自己

0%

Java读取PGM图片

最近下载了一个人脸数据库,里面的图片都是pgm格式,想提取每张图片的所有像素的像素值,初步设想是使用Java SE中读取图片。在使用Java SE中类来读取图片时,通常使用ImageIO包中的类来读取图片,但是有个缺点就是默认支持的图片格式很少,Java 8中javax.imageio支持的图片格式有:

从图中看出库仅仅支持JPEG、PNG、BMP、WBMP以及GIF这些图片格式。如果想读取其他格式(例如PGM)时应该怎么办?网上搜索到了一个Java ImageIO的扩展插件——TwelveMonkeys,安装后ImageIO就可以支持多种图片格式,这个有一个好处就是原先读取图片的代码不需要改变,读取图片还是使用 javax.imageio 包。

安装TwelveMonkeys

安装很简单,使用Maven可以很容易地添加到项目中,如果想让ImageIO支持JPEG和TIFF格式,可以在POM文件中添加下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
...
<dependencies>
...
<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-jpeg</artifactId>
<version>3.3.1</version> <!-- Alternatively, build your own version -->
</dependency>
<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-tiff</artifactId>
<version>3.3.1</version> <!-- Alternatively, build your own version -->
</dependency>
</dependencies>

如果要支持PGM格式,可以添加下面代码:

1
2
3
4
5
<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-pnm</artifactId>
<version>3.3.1</version>
</dependency>

想要支持什么格式唯一要变的地方就是artifactId中内容,基本模版就是imageio-xxx

读取PGM图片

读取一张PGM图片,然后将图片的所有像素的像素值输出到一个文本文件,实现代码如下:

灰度图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package Image;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.image.Raster;
import java.io.*;

public class PGM {
public static void main(String[] args) throws IOException {
// Grayscale image
String path = "/Users/luowanqian/Downloads/Zach_Pillar_0001.pgm";
String output = "/Users/luowanqian/Downloads/output.txt";

BufferedImage image = ImageIO.read(new File(path));
Raster source = image.getRaster();
int width = image.getWidth();
int height = image.getHeight();

int[] pixels = new int[width*height];
source.getPixels(0, 0, width, height, pixels);

BufferedWriter out = new BufferedWriter(new FileWriter(output));
for (int i=0; i<width*height; i++)
out.write(pixels[i] + " ");
out.close();
}
}