我一直有成吨的麻烦让我的算法成功读取PPM图像... 它与一些图像完美的作品,但与其他人失败,导致半灰色(RGB 205,205 ,205)图像。阅读PPM图像问题
我已经试过了我可以找到并研究了几个小时的所有东西。我一直坚持一个星期了...
我希望你们能帮忙。
Image* pnm_read(char* filePath)
{
FILE* file;
char token[20];
int imageWidth, imageHeight, maximumColorValue;
Image* image;
/* Abre arquivo PNM. */
file = fopen(filePath, "r");
if (file == NULL)
{
fprintf(stderr, "Não foi possível localizar o arquivo de imagem %s.\n", filePath);
return 0;
}
/* Lê Magic Number do cabecalho e vê se é P6*/
pnm_get_token(file, token, sizeof token);
if (strcmp(token, "P6"))
{
fprintf(stderr, "%s não é um arquivo PPM válido.\n", filePath);
fclose(file);
return 0;
}
//Lê widht, height e valor máximo rgb
if (sscanf(pnm_get_token(file, token, sizeof token), "%d", &imageWidth) != 1 ||
sscanf(pnm_get_token(file, token, sizeof token), "%d", &imageHeight) != 1 ||
sscanf(pnm_get_token(file, token, sizeof token), "%d", &maximumColorValue) != 1)
{
fprintf(stderr, "%s não é um arquivo PNM válido.\n", filePath);
fclose(file);
return 0;
}
//Se não for RGB com componentes de 8 bits (0-255) dá erro
if (maximumColorValue != 255)
{
fprintf(stderr, "%s does not have 8-bit components: maximumColorValue=%d\n", filePath, maximumColorValue);
fclose(file);
return 0;
}
image = new Image(imageWidth, imageHeight);
unsigned char* pixelComponents = new unsigned char[imageWidth * imageHeight * 3];
fread(pixelComponents, sizeof(unsigned char), imageWidth * imageHeight * 3, file);
fclose(file);
int r, g, b, pixel;
for(int i = 3; i <= imageWidth * imageHeight * 3; i += 3)
{
r = pixelComponents[i-3] & 0xff;
g = pixelComponents[i-2] & 0xff;
b = pixelComponents[i-1] & 0xff;
/*fread(&r, sizeof(char), sizeof(char), file);
fread(&g, sizeof(char), sizeof(char), file);
fread(&b, sizeof(char), sizeof(char), file);
r = r & 0xff;
g = g & 0xff;
b = b & 0xff;*/
pixel = (255 << 24) | (r << 16) | (g << 8) | b;
// Atribuindo os pixels e virando imagem de cabeca para baixo
image->pixels[ (imageWidth * imageHeight) - (i/3) - 1] = pixel;
}
printf("Lido arquivo PNM (%s): %dx%d pixels.\n", filePath, image->width, image->height);
return image;
}
你的代码失败了哪种图像? – 2013-04-26 00:33:44
随机,下载的PPM图像。但它工作(或工作,在我改变它一千次以使它工作100%之前)至少有一个例子是我在这里下载的。 它工作(或工作):https://dl.dropboxusercontent.com/u/11352921/exempla1b.ppm 它从来没有与: https://dl.dropboxusercontent.com/u/11352921/exempla2b.ppm – user1422133 2013-04-26 00:36:21
您可以发布打印屏幕和/或错误消息吗?这将有很大的帮助... – 2013-04-26 02:33:56