使用MMX或者SSE指令集,C++编程实现灰度图像H0302Gry.bmp的反相,不要使用opencv
时间: 2024-05-06 17:19:02 浏览: 10
好的,下面是代码实现:
```c++
#include <iostream>
#include <fstream>
#include <cstring>
#include <immintrin.h> //包含MMX和SSE指令集
using namespace std;
#pragma pack(2) //设置2字节对齐
//位图文件头
struct BMPFileHeader {
char bfType[2];
unsigned int bfSize;
unsigned short bfReserved1;
unsigned short bfReserved2;
unsigned int bfOffBits;
};
//位图信息头
struct BMPInfoHeader {
unsigned int biSize;
int biWidth;
int biHeight;
unsigned short biPlanes;
unsigned short biBitCount;
unsigned int biCompression;
unsigned int biSizeImage;
int biXPelsPerMeter;
int biYPelsPerMeter;
unsigned int biClrUsed;
unsigned int biClrImportant;
};
void inverseImage(char* imgData, int width, int height) {
//每次处理16个像素点,使用SSE指令集
__m128i mask = _mm_set1_epi8(-1); //设置掩码
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j += 16) {
__m128i pixel = _mm_load_si128((__m128i*)(imgData + i * width + j)); //读取16个像素点
pixel = _mm_xor_si128(pixel, mask); //与掩码进行异或操作,实现反相
_mm_store_si128((__m128i*)(imgData + i * width + j), pixel); //写回内存
}
}
}
int main() {
BMPFileHeader fileHeader;
BMPInfoHeader infoHeader;
ifstream fin("H0302Gry.bmp", ios::binary);
fin.read((char*)&fileHeader, sizeof(BMPFileHeader));
fin.read((char*)&infoHeader, sizeof(BMPInfoHeader));
int width = infoHeader.biWidth;
int height = infoHeader.biHeight;
char* imgData = new char[width * height];
fin.seekg(fileHeader.bfOffBits, ios::beg); //跳过文件头和信息头,指向位图数据
fin.read(imgData, width * height);
fin.close();
inverseImage(imgData, width, height);
ofstream fout("H0302Gry_inverse.bmp", ios::binary);
fout.write((char*)&fileHeader, sizeof(BMPFileHeader));
fout.write((char*)&infoHeader, sizeof(BMPInfoHeader));
fout.write(imgData, width * height);
fout.close();
delete[] imgData;
cout << "Done!" << endl;
return 0;
}
```
这里使用了SSE指令集中的`_mm_load_si128`、`_mm_xor_si128`和`_mm_store_si128`函数来提高处理效率。具体实现过程是,每次处理16个像素点,将它们读取到一个`__m128i`类型的变量中,再使用掩码进行异或操作,最后将结果写回内存。