pgm图像缩小C语言,C++将二进制(P5)图像转换为ascii(P2)图像(.pgm)

博主在尝试用C++编写一个程序,将二进制(P5)格式的灰度图像转换为ASCII(P2)格式。在读取和转换图像数据时遇到问题,发现存在像素值为-110,而灰度值范围应为0到255。博主寻求帮助找出错误所在。
摘要由CSDN通过智能技术生成

我正在写一个简单的程序来将灰度二进制(P5)转换为灰度ascii(P2),但是在读取二进制文件时遇到困难并将其转换整数C++将二进制(P5)图像转换为ascii(P2)图像(.pgm)

#include

#include

#include

using namespace::std;

int usage(char* arg) {

// exit program

cout << arg << ": Error" << endl;

return -1;

}

int main(int argc, char* argv[]) {

int rows, cols, size, greylevels;

string filetype;

// open stream in binary mode

ifstream istr(argv[1], ios::in | ios::binary);

if(istr.fail()) return usage(argv[1]);

// parse header

istr >> filetype >> rows >> cols >> greylevels;

size = rows * cols;

// check data

cout << "filetype: " << filetype << endl;

cout << "rows: " << rows << endl;

cout << "cols: " << cols << endl;

cout << "greylevels: " << greylevels << endl;

cout << "size: " << size << endl;

// parse data values

int* data = new int[size];

int fail_tracker = 0; // find which pixel failing on

for(int* ptr = data; ptr < data+size; ptr++) {

char t_ch;

// read in binary char

istr.read(&t_ch, sizeof(char));

// convert to integer

int t_data = static_cast(t_ch);

// check if legal pixel

if(t_data < 0 || t_data > greylevels) {

cout << "Failed on pixel: " << fail_tracker << endl;

cout << "Pixel value: " << t_data << endl;

return usage(argv[1]);

}

// if passes add value to data array

*ptr = t_data;

fail_tracker++;

}

// close the stream

istr.close();

// write a new P2 binary ascii image

ofstream ostr("greyscale_ascii_version.pgm");

// write header

ostr << "P2 " << rows << cols << greylevels << endl;

// write data

int line_ctr = 0;

for(int* ptr = data; ptr < data+size; ptr++) {

// print pixel value

ostr << *ptr << " ";

// endl every ~20 pixels for some readability

if(++line_ctr % 20 == 0) ostr << endl;

}

ostr.close();

// clean up

delete [] data;

return 0;

}

sample image - 从一个旧的职位拉了这个。删除了图片文件中的注释,因为我现在不担心这个功能。

当使用g ++编译,我得到的输出:

$> ./a.out a.pgm

filetype: P5

rows: 1024

cols: 768

greylevels: 255

size: 786432

Failed on pixel: 1

Pixel value: -110

a.pgm: Error

的形象是一只小鸭子,有没有办法像素值可以是-110 ...我要去哪里错了? 谢谢。

2012-10-26

tubby

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值