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;
    }




  • 相关阅读:
    Alook搭配JS脚本完美食用
    分享小米刷机教程/线刷(工具支持小米华为一加)
    iPhone 无需越狱修改wx+zfb+qq步数
    如果SELECT语句中没有结果,则使用CASE返回字符串
    MSSQLServer 正在显示"正在还原...."
    C# 小技巧
    C#使用Select方法快速获取List集合集合中某个属性的所有值集合
    C#中使用Sum方法对List集合进行求和操作
    sql日期函数
    sql只根据某一字段去重,并保留其他字段
  • 原文地址:https://www.cnblogs.com/corfox/p/5415025.html
Copyright © 2011-2022 走看看