我觉得我错过了一些简单的东西(像往常一样)。

我试着用Java读取PGM图像。Matlab做得很好-在Matlab中输出图像像素(例如,一个小的32x32图像)给了我这样的感觉:

1 0 11 49 94 118 118 106 95 88 85 96 124 143 142 133

然而,我的Java阅读器输出:

1 0 11 49 94 118 118 106 95 88 85 96 124 65533 65533 65533

似乎127以上的像素值用65533填充,但它确实会得到一些不正确的随机值,甚至会将几乎整个底行的值赋给-1。

下面是我使用的代码:

filePath = 'imagepath.pgm';

FileInputStream fileInputStream = new FileInputStream(filePath);

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));

// read the header information ...

int [][] data2D = new int [picWidth] [picHeight];

for (int row = 0; row < picHeight; row++) {

for (int col = 0; col < picWidth; col++) {

data2D[row][col] = bufferedReader.read();

System.out.print(data2D[row][col] + " ");

}

System.out.println();

}

fileInputStream.close();

任何想法都会受到极大的赞赏。

编辑

以下是无符号PGM值:

1 0 11 49 94 118 118 106 95 88 85 96 124 143 142 133

30 26 29 57 96 122 125 114 102 94 91 101 127 146 145 136

96 85 70 75 101 128 136 126 111 106 106 112 131 149 153 147

163 147 114 93 99 120 132 123 110 113 124 129 137 154 166 168

215 195 149 105 88 99 114 111 106 123 148 158 160 174 191 197

245 224 173 115 81 82 100 109 117 144 179 194 194 205 222 230

235 217 170 115 78 78 113 117 100 83 80 212 214 226 244 253

178 167 135 93 68 78 123 129 106 77 69 202 204 222 244 255

114 110 92 64 54 81 107 105 83 59 56 182 184 201 222 231

79 80 71 52 55 97 67 55 41 33 42 184 179 181 185 183

62 66 65 52 63 115 29 16 12 17 30 209 197 174 150 132

40 47 52 44 55 109 171 196 188 186 208 229 218 179 136 107

31 38 44 37 43 89 145 167 158 159 191 223 219 179 133 105

48 52 56 51 57 91 128 133 117 120 157 196 200 168 128 105

64 67 70 73 87 114 127 107 79 81 118 159 173 154 123 104

63 67 73 83 107 132 129 91 54 54 88 130 153 146 123 106

标题如下:

P5

# MatLab PGMWRITE file, saved 27-Jun-2002

16 16

255

编辑第2页

以下是对概念验证代码的完整输出:

Skipping unknow token: ""

Skipping unknow token: "1^vvj_XU`|���"

Skipping unknow token: ""

Skipping unknow token: "9`z}rf^[e���`UFKe��~ojjp������r]cx�{nq|������ÃiXcroj{��������sQRdmu��������٪sNNqudSP�����]DN{�jME�����rn\@6QkiS;8�����OPG47aC7)!*�����>BA4?s"

Skipping unknow token: ""

Skipping unknow token: ""

Skipping unknow token: "�Ů��(/4,7m�ļ���ڳ�k"

Skipping unknow token: "&,%+Y������۳�i04839[��ux��Ȩ�i@CFIWrkOQv���{h?CISk��[66X���{j"

Exception in thread "main" java.util.NoSuchElementException

at java.util.Scanner.throwFor(Scanner.java:838)

at java.util.Scanner.next(Scanner.java:1347)

at Test.main(Test.java:49)

抛出异常中提到的第49行是:

System.out.println(String.format("Skipping unknow token: \"%s\"", scan.next()));

我敢肯定,问题与这样一个事实有关:这些图像文件既包含ASCII文本/数字,也包含二进制图像数据。但是如果Java阅读PNGS没有问题,为什么缺乏对PGMs的支持呢?

编辑3

好的,我发现了一个有效的实现……不幸的是,它被否决了:

filePath = "imagepath.pgm"

FileInputStream fileInputStream = new FileInputStream(filePath);

DataInputStream dis = new DataInputStream(fileInputStream);

StreamTokenizer streamTokenizer = new StreamTokenizer(dis);

// read header text using StreamTokenizer.nextToken()

data2D = new int [picWidth] [picHeight];

for (int row = 0; row < picHeight; row++) {

for (int col = 0; col < picWidth; col++) {

data2D[row][col] = dis.readUnsignedByte();

System.out.print(data2D[row][col] + " ");

}

System.out.println();

}

根据Java文档,

StreamTokenizer(InputStream)

不推荐使用构造函数,因为

DataInputStream.readLine()

方法无法将原始字节正确转换为字符。然而,它似乎在这个特定的情况下对头文件有效,并且显然对随后的二进制图像数据有效。

不幸的是,它仍然被弃用,而且似乎通过混合

BufferedReader

如文件所示,只有

EOFException

s在读取头并尝试使用

DataInputStream

读取原始字节。仍在寻找解决方案…

java pgm_如何读取Java中的PGM图像?相关推荐

  1. 基于Java线程池读取数据库中数据(学习+运用)

    基于Java线程池读取数据库中数据(学习+运用) 以下是学习内容 Main.java import java.util.concurrent.ArrayBlockingQueue; import ja ...

  2. java通过poi读取excel中的日期类型数据或自定义类型日期

    java通过poi读取excel中的日期类型数据或自定义类型日期 Java 读取Excel表格日期类型数据的时候,读出来的是这样的  12-十月-2019,而Excel中输入的是 2019/10/12 ...

  3. java 文件路径读取,java中依据路径读取文件

    java中根据路径读取文件 根据文件路径读取文件.具体代码如下: /** * 根据文件路径读取文件 * @param path * @return String * @throws IOExcepti ...

  4. Java基础,读取文件中的内容写入到另外一个文件。

    有两种方法,首先: 第一种方法:一次性全部读取所有文件内容(这里Arrays.sort(b)代表对字节进行排序,如果不需要进行删除即可) import java.io.FileInputStream; ...

  5. java串口编程-读取称重仪表中净重

    一.需求说明 将仪表和计算机串口相连,计算机通过软件向仪表发送指令,然后仪表返回结果,在计算机软件界面上显示. 二.实现过程 1.查看仪表说明书 仪表型号为XK3190-A9,主要是查看相关参数(波特 ...

  6. JAVA单字节读取,java资料读取。(单字节读取和按行读取读取)

    当前位置:我的异常网» 编程 » java资料读取.(单字节读取和按行读取读取) java资料读取.(单字节读取和按行读取读取) www.myexceptions.net  网友分享于:2013-12 ...

  7. python解析java文件_读取java文件

    JAVA通信编程(二)--如何读取java的properties配置文件(插播) 如何读取java的properties配置文件本不属于java通讯编程这个系列的范畴,但是在做一些应用中编写通讯编程需 ...

  8. java数组硬盘读取,java中如何通过IO流将稀疏数组写入磁盘和从磁盘中读取,整行存,整行取...

    匿名用户 1级 2019-06-13 回答 //写入磁盘 public static void writ(int sparseArr[][]) { System.out.println("写 ...

  9. java通过poi读取excel中的日期类型

    1.问题分析 Java 读取Excel表格日期类型数据的时候,读出来的是这样的 12-十月-2020,而Excel中输入的是 2020/10/12 或 2020-10-12 poi处理excel时,当 ...

  10. Java 使用EasyExcel读取Excel中多个sheet方法及示例代码

    本文主要介绍Java中,使用EasyExcel读取Excel文件中多个Sheet的方法,以及使用示例代码. 1.读取数据的实体对象 @Data public class DemoData {priva ...

最新文章

  1. java static 可见性_Java多线程 synchronized与可见性的关系以及可见性问题总结
  2. UESTC 1698 The Game
  3. 使用Advanced Installer制作IIS安装包(二:配置安装包依赖项和自定义dll)
  4. 常用控制台命令大全-Ubuntu篇
  5. python3 -c 和 python3 -m
  6. 关于水晶报表的一些错误
  7. Source Insight常用快捷键
  8. 题解 CF1391B 【Fix You】
  9. 设置darktable为中文
  10. 彻底的清除Office 以便重新安装
  11. php varbinary,php – 无法从MSSQL中获取varbinary数据
  12. php5 安装imagick,为php安装imagick拓展与image magick图像处理库
  13. Android蓝牙开发与串口蓝牙通讯
  14. 实现游戏的存档以及读档
  15. 怎么给照片加水印?今天教你一个方法
  16. 电阻电容电感二极管三极管在电路中的作用
  17. 编译:一个 C 程序的艺术之旅(转载)
  18. css3简单动画 上下切换图片效果:
  19. 《数字图像处理》手动实现最佳陷波滤波
  20. Quantopian投资组合和绩效分析工具:Pyfolio

热门文章

  1. 幻灯播放主题图片插件thread_slide_for_discuz x2 适合户外 摄影类论坛
  2. MySQL讲义第 53 讲——select 查询之 select 语句执行过程分析
  3. 上海--黄山三日自助游功略白金终极版
  4. jQuery基本操作--制作论坛发帖
  5. 光剑评注:其实,说了这么多废话,无非就是: 一切皆是映射。不管是嵌套 XML,还是 Lisp 嵌套括号,还是 XXX 的 Map 数据结构,一切都是树形结构——映射。...
  6. ibm服务器维修检测报告,启创云小机(IBM POWER7)测试报告
  7. oracle 日期格式筛选,oracle 日期格式怎么筛选
  8. 「题解」agc031_e Snuke the Phantom Thief
  9. CPP design pattern Singleton
  10. 谈业务流程全生命周期管理支撑业务流程再造(1)