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




  • 相关阅读:
    mui 时间选择器和上传图片
    css实现聊天气泡效果
    css总结 -使用display:inline-block,出现元素高度错位
    js DIV延时几秒后消失或显示代码
    js监听textarea 内容的变化,并计算内容的长度c
    生成git的SSH公钥
    IDEA中把普通的Java项目转换成gradle项目
    Idea中自动生成get,set,toString等方法
    IDEA中阿里P3C插件的安装与使用
    IDEA中SonarLint的安装与使用
  • 原文地址:https://www.cnblogs.com/corfox/p/5415025.html
Copyright © 2011-2022 走看看