将 BMP 图像转换为灰度



我正在尝试将BMP图像转换为灰度。

我已经加载了数据(在这里找到并调整了一些功能(:

struct Info{
int width;
int height;
int offset;
unsigned char * info;
unsigned char * data;
int size;
};
Info readBMP(char* filename)
{
int i;
std::ifstream is(filename, std::ifstream::binary);
is.seekg(0, is.end);
i = is.tellg();
is.seekg(0);
unsigned char *info = new unsigned char[i];
is.read((char *)info,i);
int width = *(int*)&info[17];
int height = *(int*)&info[21];
int offset = *(int*)&info[10];
unsigned char a[offset];
unsigned char *b = new unsigned char[i - offset];
std::copy(info,
info + offset,
a);
std::copy(info + offset,
info + i,
b + 0);
Info dat;
dat.width = width;
dat.height = height;
dat.offset = offset;
dat.size = i;
dat.info = new unsigned char[offset - 1];
dat.data = new unsigned char[i - offset];
for( int j = 0; j < offset ; j++ ){
dat.info[j] = a[j];
}
for( int j = 0; j < i - offset; j++ ){
dat.data[j] = b[j];
}
return dat;
}

(加载正常工作,我尝试加载和保存数据,结果是相同的图像(

现在,如果我理解正确,数据应该是width * height * 3长度。

我正在尝试使用以下方法应用灰度滤镜:

void greyScale( unsigned char * src , int rows, int cols){
for( int i = 0; i < rows; i++){
for( int j = 0;  j < cols; j++){
char r = src[3 * (i * rows + j)];
char g = src[3 * (i * rows + j) + 1];
char b = src[3 * (i * rows+ j) + 2];
char linearIntensity = (char)(0.2126f * r + 0.7512f * g + 0);
src[3 * (i * rows + j)]= linearIntensity;
src[3 * (i * rows + j) + 1] = linearIntensity;
src[3 * (i * rows+ j) + 2] = linearIntensity;
}
}
}

用法:

int main() {
//unsigned char* info = new unsigned char[54];
Info dat = readBMP("C:\Users\Me\Downloads\test.bmp");
greyScale(dat.data,dat.width,dat.height);

ofstream fout;
fout.open("out.bmp", ios::binary | ios::out);
fout.write( reinterpret_cast<char *>(dat.info), dat.offset);
fout.write( reinterpret_cast<char *>(dat.data), dat.size - dat.offset );
fout.close();
return 0;
}

但是我在 j = 3067 和 i = 6 处收到了段错误,对此我很困惑,因为它不应该超出索引(循环不应访问索引中的任何细(。

我以为这是一些填充问题,但填充只是 0,所以它应该不是问题。

为什么会这样?为什么我会收到好的旧段错误?我找不到原因。

感谢您的帮助!

我不确定这是否是错字,但您似乎使用的是行变量而不是 cols 变量, 试试这个

void greyScale( unsigned char * src , int rows, int cols){
for( int i = 0; i < rows; i++){
for( int j = 0;  j < cols; j++){
char r = src[3 * (i * cols + j)];
char g = src[3 * (i * cols + j) + 1];
char b = src[3 * (i * cols + j) + 2];
char linearIntensity = (char)(0.2126f * r + 0.7512f * g + 0);
src[3 * (i * cols + j)] = linearIntensity;
src[3 * (i * cols + j) + 1] = linearIntensity;
src[3 * (i * cols + j) + 2] = linearIntensity;
}
}
}

最新更新