Untitled
unknown
plain_text
4 years ago
3.0 kB
2
Indexable
#include <iostream> #include <fstream> using namespace std; struct bmpheader { char Signature[2]; int FileSize; int Reserved; int DataOffSet; }; struct DIB { int dibSize; int width; int height; short planes; short bpp; int compression; int imageSize; int XpixelsperM; int YpixelsperM; int colorsUsed; int importantColor; }; struct bmpImage { bmpheader header; DIB dib; char* pDIBReserved; char* pImageData; }; void readBMP(const char* filename, bmpImage& bmp) { ifstream fin(filename, ios::in | ios::binary); if (!fin) return; fin.seekg(0, ios_base::beg); fin.read((char*)&bmp.header, 14); fin.read((char*)&bmp.dib, 40); if (bmp.dib.dibSize > 40) { int d = bmp.dib.dibSize - 40; bmp.pDIBReserved = new char[d]; fin.read(bmp.pDIBReserved, d); } bmp.pImageData = new char[bmp.dib.imageSize]; fin.read(bmp.pImageData, bmp.dib.imageSize); } int writeBMP(const char* filename, bmpImage bmp) { ofstream fout(filename, ios::out | ios::binary); if (!fout) return 0; fout.seekp(0, ios_base::beg); fout.write((char*)&bmp.header, 14); fout.write((char*)&bmp.dib, 40); if (bmp.dib.dibSize > 40) { int d = bmp.dib.dibSize - 40; bmp.pDIBReserved = new char[d]; fout.write(bmp.pDIBReserved, d); } //bmp.pImageData = new char[bmp.dib.imageSize]; fout.write(bmp.pImageData, bmp.dib.imageSize); return 1; } int ConvertTo8bit(bmpImage srcBMP, bmpImage& dstBMP) { if (srcBMP.dib.bpp != 24 && srcBMP.dib.bpp != 32 && srcBMP.pImageData == NULL) return 0; dstBMP.header = srcBMP.header; dstBMP.dib = srcBMP.dib; dstBMP.dib.bpp = 8; int width = srcBMP.dib.width; int height = srcBMP.dib.height; int padding = 0; dstBMP.dib.imageSize = width * height * (dstBMP.dib.bpp / 8) + height * padding; return 1; dstBMP.pImageData = new char[dstBMP.dib.imageSize]; char* pSrcRow = srcBMP.pImageData; char* pDstRow = dstBMP.pImageData; int nSrcByteInPix = srcBMP.dib.bpp / 8; int nDstByteInPix = dstBMP.dib.bpp / 8; int nSrcByteInRow = (width * nSrcByteInPix) + padding; int nDstByteInRow = (width * nDstByteInPix) + padding; for (int y = 0; y < height; y++) { char* pSrcPix = pSrcRow; char* pDstPix = pDstRow; for (int x = 0; x < width; x++) { char A, B, G, R; if (srcBMP.dib.bpp == 24) { B = pSrcPix[0]; G = pSrcPix[1]; R = pSrcPix[2]; } if (srcBMP.dib.bpp == 32) { A = pSrcPix[0]; B = pSrcPix[1]; G = pSrcPix[2]; R = pSrcPix[3]; } char avg = (char)((B + G + R) / 3); pDstPix[0] = avg; pSrcPix += nSrcByteInPix; pDstPix += nDstByteInPix; } pSrcRow += nSrcByteInRow; pDstRow += nDstByteInRow; } return 1; } int main() { bmpImage srcImage = { NULL }, dstImage = { NULL }; readBMP("input.bmp", srcImage); //ConvertTo8bit(srcImage, dstImage); writeBMP("output.bmp", srcImage); //writeBMP("output_2.bmp", dstImage); return 0; }
Editor is loading...