zoukankan      html  css  js  c++  java
  • 数字图像处理学习笔记(1.0)---位图的读写、几何变换、傅里叶变换、直方图均衡

    位图的读写


    #include"bmp.h"
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    
    using namespace std;
    
    
    Bitmap::Bitmap()
    {
    
    }
    
    Bitmap::~Bitmap()
    {
    	if (dataBuf!=NULL)
    		delete[] dataBuf;
    	dataBuf = NULL;
    	if (colorTable != NULL)
    		delete[] colorTable;
    	colorTable = NULL;
    }
    
    bool Bitmap::read(char* fileName)
    {
    	FILE* f = fopen(fileName, "rb");
    	if (f == NULL)
    		return false;
    
    	if (dataBuf != NULL)//释放旧的图像数据内存和颜色表内存
    		delete[] dataBuf;
    	if (colorTable != NULL)
    		delete[] colorTable;
    	dataBuf = NULL;
    	colorTable = NULL;
    	
    	fread(&fileHeader, sizeof(BITMAPFILEHEADER), 1, f);
    	fread(&infoHeader, sizeof(BITMAPINFOHEADER), 1, f);
    
    	width_p = infoHeader.biWidth;
    	height_p = infoHeader.biHeight;
    	bitCount = infoHeader.biBitCount;
    
    	if (bitCount == 8)
    	{
    		colorTable = new RGBQUAD[256];
    		fread(colorTable, sizeof(RGBQUAD), 256, f);
    	}
    
    	dataBuf = new unsigned char[infoHeader.biSizeImage];
    	fread(dataBuf, 1, infoHeader.biSizeImage, f);
    
    	fclose(f);
    	return 1;
    }
    
    bool Bitmap::write(char* fileName)
    {
    	FILE* f = fopen(fileName, "wb");
    	if (f == NULL)
    		return false;
    
    	int colorTableSize = 0;
    	if (bitCount == 8)
    		colorTableSize = sizeof(RGBQUAD)* 256;
    
    	int headerSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colorTableSize;
    	int lineSize = (width_p*bitCount / 8 + 3) / 4 * 4;
    	int dataSize = lineSize*height_p;
    
    	fileHeader.bfType = 0x4D42;
    	fileHeader.bfSize = headerSize + dataSize;
    	fileHeader.bfReserved1 = 0;
    	fileHeader.bfOffBits = headerSize;
    
    	infoHeader.biSize = 40;
    	infoHeader.biWidth = width_p;
    	infoHeader.biHeight = height_p;
    	infoHeader.biPlanes = 1;
    	infoHeader.biBitCount = bitCount;
    	infoHeader.biCompression = BI_RGB;
    	infoHeader.biSizeImage = dataSize;
    	infoHeader.biXPelsPerMeter = 0;
    	infoHeader.biYPelsPerMeter = 0;
    	infoHeader.biClrUsed = 0;
    	infoHeader.biClrImportant = 0;
    
    	fwrite(&fileHeader, sizeof(BITMAPFILEHEADER), 1, f);
    	fwrite(&infoHeader, sizeof(BITMAPINFOHEADER), 1, f);
    	if (bitCount == 8)
    	{
    		fwrite(colorTable, sizeof(RGBQUAD), 256, f);
    	}
    	fwrite(dataBuf, 1, dataSize, f);
    
    	fclose(f);
    	return true;
    }

    测试:

    #include"bmp.h"
    #include<iostream>
    
    using namespace std;
    
    int main()
    {
    	char* fileName = "qianxun.bmp";
    	Bitmap* bmp = new Bitmap();
    	bmp->read(fileName);
    	bmp->write("write.bmp");
    	delete bmp;
    	return 1;
    }




  • 相关阅读:
    积性函数大全(欧拉函数、莫比乌斯反演、杜教筛……)
    Codeforces 1427 G.One Billion Shades of Grey
    Codeforces Global Round 11 A-F题解
    一般难度模板复习
    (补充)证明线性递推相关的Hamilton-Cayley定理
    [ZJOI2018]树
    [ICPC-Beijing 2006]狼抓兔子
    P4869 albus就是要第一个出场
    浅谈算法——线性基
    [COCI2017-2018#1] Deda
  • 原文地址:https://www.cnblogs.com/corfox/p/5415025.html
Copyright © 2011-2022 走看看