Android中的PPM图像
我正在尝试在Android中打开.ppm图像(便携式pixmaps)。我已经破译了足够的格式来创建这个:Android中的PPM图像,android,image,ppm,Android,Image,Ppm,我正在尝试在Android中打开.ppm图像(便携式pixmaps)。我已经破译了足够的格式来创建这个: public static Bitmap ReadBitmapFromPPM(String file) throws IOException { //FileInputStream fs = new FileInputStream(file); BufferedReader reader = new BufferedReader(new FileReader(file));
public static Bitmap ReadBitmapFromPPM(String file) throws IOException
{
//FileInputStream fs = new FileInputStream(file);
BufferedReader reader = new BufferedReader(new FileReader(file));
if (reader.read() != 'P' || reader.read() != '6')
return null;
reader.read(); //Eat newline
String widths = "", heights = "";
char temp;
while ((temp = (char)reader.read()) != ' ')
widths += temp;
while ((temp = (char)reader.read()) >= '0' && temp <= '9')
heights += temp;
if (reader.read() != '2' || reader.read() != '5' || reader.read() != '5')
return null;
reader.read(); //Eat the last newline
int width = Integer.parseInt(widths);
int height = Integer.parseInt(heights);
int[] colors = new int[width*height];
//Read in the pixels
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
char[] pixel = new char[3];
reader.read(pixel);
/*
int red = reader.read();
int green = reader.read();
int blue = reader.read();
byte r = (byte)red;
byte g = (byte)green;
byte b = (byte)blue;*/
colors[y*width + x] = //(255 << 24) | //A
(pixel[0]&0x0ff << 16) | //R
(pixel[1]&0x0ff << 8) | //G
(pixel[2]&0x0ff); //B
}
}
Bitmap bmp = Bitmap.createBitmap(colors, width, height, Bitmap.Config.ARGB_8888);
公共静态位图ReadBitmapFromPPM(字符串文件)引发IOException
{
//FileInputStream fs=新的FileInputStream(文件);
BufferedReader reader=新的BufferedReader(新文件读取器(文件));
if(reader.read()!=“P”| reader.read()!=“6”)
返回null;
reader.read();//吃换行符
字符串宽度=”,高度=”;
焦炭温度;
while((temp=(char)reader.read())!=“”)
宽度+=温度;
while((temp=(char)reader.read())>='0'&&temp我的代码相当愚蠢,因为我没有研究Java中的字符实际上是什么。Java中的字符不是一个简单的字节。当代码被修改为逐字节使用时,它就可以工作了。对于仍在努力解决这一问题的任何人,我成功地创建了一个功能解决方案,将它与我在网上找到的一些其他代码合并在一起e:
public static Bitmap ReadBitmapFromPPM2(String file) throws IOException {
//FileInputStream fs = new FileInputStream(file);
BufferedInputStream reader = new BufferedInputStream(new FileInputStream(new File(file)));
if (reader.read() != 'P' || reader.read() != '6')
return null;
reader.read(); //Eat newline
String widths = "" , heights = "";
char temp;
while ((temp = (char) reader.read()) != ' ') {
widths += temp;
}
while ((temp = (char) reader.read()) >= '0' && temp <= '9')
heights += temp;
if (reader.read() != '2' || reader.read() != '5' || reader.read() != '5')
return null;
reader.read();
int width = Integer.valueOf(widths);
int height = Integer.valueOf(heights);
int[] colors = new int[width * height];
byte [] pixel = new byte[3];
int len = 0;
int cnt = 0;
int total = 0;
int[] rgb = new int[3];
while ((len = reader.read(pixel)) > 0) {
for (int i = 0; i < len; i ++) {
rgb[cnt] = pixel[i]>=0?pixel[i]:(pixel[i] + 255);
if ((++cnt) == 3) {
cnt = 0;
colors[total++] = Color.rgb(rgb[0], rgb[1], rgb[2]);
}
}
}
Bitmap bmp = Bitmap.createBitmap(colors, width, height, Bitmap.Config.ARGB_8888);
return bmp;
}
公共静态位图ReadBitmapFromPPM2(字符串文件)引发IOException{
//FileInputStream fs=新的FileInputStream(文件);
BufferedInputStream读取器=新BufferedInputStream(新文件输入流(新文件));
if(reader.read()!=“P”| reader.read()!=“6”)
返回null;
reader.read();//吃换行符
字符串宽度=”,高度=”;
焦炭温度;
while((temp=(char)reader.read())!=“”){
宽度+=温度;
}
而((temp=(char)reader.read())>='0'和&temp 0){
对于(int i=0;i=0?像素[i]:(像素[i]+255);
如果(++cnt)==3){
cnt=0;
colors[total++]=Color.rgb(rgb[0],rgb[1],rgb[2]);
}
}
}
位图bmp=Bitmap.createBitmap(颜色、宽度、高度、Bitmap.Config.ARGB_8888);
返回bmp;
}
您可以获得的完整源代码,无需猜测。我确实遇到过这一点,但考虑到我在寻找一个相当简单的解决方案时的分布式核心代码,这是一个令人惊讶的复杂问题,但感谢您的指针。嗨,我知道它太长了,但您能给我看一下您的解决方案的代码片段吗?我也有相同的代码片段我想看看你对这个问题的实现。我很久以前就更改了代码,直接处理rgb位图。我相信这只是一个用字节交换字符的问题,但现在我记不起来了。你是从本机获得这个图像的吗?