大佬們,問一個問題:讀取bmp檔案進行灰度化處理之后,再以文本方式寫入,有些圖片會發生不同程度的偏移,而有些圖片卻是正常的灰度化圖片。而如果是二值化,所有圖片都是正常的。




#include <iostream>
#include <Windows.h>
#include <opencv2/opencv.hpp>
using namespace std;
void main()
{
FILE* stream = NULL;
errno_t err = 0;
err = fopen_s(&stream, "4.bmp", "rb");
if (err != 0)
{
cout << "檔案不存在" << endl;
return;
}
int sizeFileHeader = sizeof(BITMAPFILEHEADER);//檔案頭大小
int sizeInfoHeader = sizeof(BITMAPINFOHEADER);//資訊頭大小
BITMAPFILEHEADER* bitmapFileHeader = new BITMAPFILEHEADER[sizeFileHeader];//結構體指標
BITMAPINFOHEADER* bitmapInfoHeader = new BITMAPINFOHEADER[sizeInfoHeader]; //加一
memset(bitmapFileHeader, 0, sizeFileHeader);//給記憶體空間賦值
memset(bitmapInfoHeader, 0, sizeInfoHeader);//
fread(bitmapFileHeader, sizeof(char), sizeFileHeader, stream);
fseek(stream, sizeFileHeader, 0);
fread(bitmapInfoHeader, sizeof(char), sizeInfoHeader, stream);
int srcImageLineByteCount = (((bitmapInfoHeader->biWidth) * 24 + 31) / 32) * 4;//原圖每一行的資料個數
int destImageLineByteCount = (((bitmapInfoHeader->biWidth) * 24 + 31) / 32) * 4;//結果圖
//**************位圖資訊頭*****************
BYTE **oldImageData = new BYTE *[bitmapInfoHeader->biHeight];//指標的指標,相當于二維陣列
for (int i = 0; i < bitmapInfoHeader->biHeight; i++)
{
oldImageData[i] = new BYTE[srcImageLineByteCount];
memset(oldImageData[i], 0, srcImageLineByteCount);//加一
}
//**************位圖資料*******************
fseek(stream, sizeFileHeader + sizeInfoHeader, 0);//從資料區開始讀
//讀取影像資料
for (int i = 0; i<bitmapInfoHeader->biHeight; i++)
{
for (int j = 0; j < srcImageLineByteCount; j++)
{
fread(&oldImageData[i][j], sizeof(BYTE), 1, stream);
}
}
//寫資料
BYTE **newImageData = new BYTE *[bitmapInfoHeader->biHeight];
for (int i = 0; i < bitmapInfoHeader->biHeight; i++)
{
newImageData[i] = new BYTE[destImageLineByteCount];
}
for (int i = 0; i < bitmapInfoHeader->biHeight; i++)
{
for (int j = 0; j < destImageLineByteCount; j+=3)
{
newImageData[i][j] = newImageData[i][j+1] = newImageData[i][j+2] =
(int)((float)oldImageData[i][j] * 0.114 +
(float)oldImageData[i][j+1] * 0.587 + (float)oldImageData[i][j+2] * 0.299 );
/*if (newImageData[i][j] > 128)
newImageData[i][j] = newImageData[i][j + 1] = newImageData[i][j + 2] = 255;
else
newImageData[i][j] = newImageData[i][j + 1] = newImageData[i][j + 2] = 0;
*/
}
}
//寫入檔案
FILE* fileWrite = NULL;
err = fopen_s(&fileWrite, "19.bmp", "w+");//這里用wb++的話才是正確的
fwrite(bitmapFileHeader, sizeof(char), sizeof(BITMAPFILEHEADER), fileWrite);
fwrite(bitmapInfoHeader, sizeof(char), sizeof(BITMAPINFOHEADER), fileWrite);
//fwrite(pRgbQuards, sizeof(RGBQUAD), 256, fileWrite);
for (int i = 0; i < bitmapInfoHeader->biHeight; i++)
{
for (int j = 0; j < destImageLineByteCount; j++)
{
fwrite(&newImageData[i][j], sizeof(BYTE), 1, fileWrite);
}
}
fclose(fileWrite);
cout << "success" << endl;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/166928.html
標籤:C++ 語言
上一篇:用堆疊實作四則運算式運算的一道題
