loadbmp.cpp

来自「VC编写的基本读图文件」· C++ 代码 · 共 163 行

CPP
163
字号
// LoadBmp.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"
#include "math.h"

#include "cv.h"
#include "highgui.h"
#include "cvmat.hpp"

/*
typedef struct tagBITMAPFILEHEADER
{
	unsigned short  bfType;
	unsigned long bfSize;
	unsigned short  bfReserved1;
	unsigned short  bfReserved2;
	unsigned long bfOffBits;
}BITMAPFILEHEADER;

typedef struct tagBITMAPINFOHEADER
{
	unsigned long biSize;
	long biWidth;
	long biHeight;
	unsigned short biPlanes;
	unsigned short biBitCount;
	unsigned long biCompression;
	unsigned long biSizeImage;
	long biXPelsPerMeter;
	long biYPelsPerMeter;
	unsigned long biClrUsed;
	unsigned long biClrImportant;
}BITMAPINFOHEADER;

typedef struct tagRGBQUAD
{
	unsigned char rgbBlue;
	unsigned char rgbGreen;
	unsigned char rgbRed;
	unsigned char rgbReserved;
}RGBQUAD;
*/
void writeimage(double *Data,int Height,int Width,char *filename);
void showimage(char *filename1,char *filename2);

void Exit(char *ErrorCode)
{
	printf("%s",ErrorCode);
	printf("Programme Quit!!\n\n");
	exit(0);
}

long WidthBytes(long Width,int BitCount)
{
	long WBytes;
	WBytes=(Width*BitCount+31)/8;
	WBytes=WBytes/4*4;
	return WBytes;
}

void main(int argc,char* argv[])
{
	char filename1[250];             //="C:\\aaaa.bmp";
	char filename2[250];             //="C:\\bb.bmp";

	printf("Please input the original image path:\n    ");
	scanf("%s",filename1);
	printf("Please input the new image path:\n    ");
	scanf("%s",filename2);
	
	long i,j;
	long WBytes;
	int Colors;
	long Height,Width;
	FILE *fp1;
	BITMAPFILEHEADER bfh;
	BITMAPINFOHEADER bih;
	RGBQUAD QUAD[256];
	double *Data;
	unsigned char SrcData;
	if((fp1=fopen(filename1,"rb"))==NULL)
	{
		Exit("Can not open the file.\n");
	}
	fseek(fp1,0,SEEK_SET);
	fread(&bfh,sizeof(BITMAPFILEHEADER),1,fp1);
	if(bfh.bfType!='M'*256+'B')
	{
		Exit("This is not a bmp file.\n");
	}
	fseek(fp1,14,SEEK_SET);
	fread(&bih,sizeof(BITMAPINFOHEADER),1,fp1);
	Height=bih.biHeight;
	Width=bih.biWidth;
	WBytes=WidthBytes(Width,bih.biBitCount);
	Colors=1<<bih.biBitCount;
	Data=(double*)malloc(Height*Width*sizeof(double));
	if(Colors!=256)
	{
		Exit("This programme only for 256 colors bmp.\n");
	}
	fseek(fp1,54,SEEK_SET);
	fread(QUAD,sizeof(RGBQUAD),256,fp1);
	for(i=Height-1;i>=0;i--)
	{
		for(j=0;j<Width;j++)
		{
			fseek(fp1,54+Colors*sizeof(RGBQUAD)+i*WBytes+j,SEEK_SET);
			fread(&SrcData,1,1,fp1);
			Data[(Height-1-i)*Width+j]=SrcData;
		}
	}
	fclose(fp1);
/////////////////////////////////////////////////////////////////////////
	writeimage(Data,Height,Width,filename2);
	
	printf("\nProgramme Finish!!\n");
	showimage(filename1,filename2);

	free(Data);
}
void writeimage(double *Data,int Height,int Width,char *filename)
{
	unsigned char *CharData;
	CharData=(unsigned char*)malloc(Height*Width*sizeof(unsigned char));
	int i,j;
	for (i=0;i<Height;i++)
		for (j=0;j<Width;j++)
			CharData[i*Width+j]=(unsigned char)Data[i*Width+j];
	CvMat *mat=cvCreateMat(Height, Width, CV_8UC1);
	cvInitMatHeader(mat, Height, Width, CV_8UC1, CharData);
	cvSaveImage(filename, mat);
	free(CharData);
	cvReleaseMat(&mat);
}
void showimage(char *filename1,char *filename2)
{
	IplImage* src_image;
	src_image= cvLoadImage(filename1);
	cvNamedWindow("原始图像",CV_WINDOW_AUTOSIZE);	
	cvShowImage("原始图像",src_image);
	cvWaitKey(10);
	
	IplImage* dst_image;
	dst_image= cvLoadImage(filename2);
	cvNamedWindow("变换后图像",CV_WINDOW_AUTOSIZE);	
	cvShowImage("变换后图像",dst_image);
	cvWaitKey(0);
	
	cvDestroyWindow("原始图像");
	cvReleaseImage(&src_image);	

	cvDestroyWindow("变换后图像");
	cvReleaseImage(&dst_image);
}



⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?