⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readphoto.cpp

📁 实现jpeg的压缩编码功能 在demo2的工程文件中即可查看
💻 CPP
字号:
#include "stdafx.h"

#define WIDTHBYTES(bits)    (((bits) + 31) / 32 * 4) 

unsigned char* ReadBmpFile(const char* pszFileName, int& nImgWidth, int& nImgHeight)
{
	BITMAPFILEHEADER bf;
	BITMAPINFOHEADER bi;
	HGLOBAL hImgData;
	BYTE *lpImgData;
	
	int LineBytes =0;
	int ImgSize =0;
	int NumColors = 0;

	FILE* fin = NULL;
	fin = fopen(pszFileName,"rb");
	if(fin == NULL)
	{
		printf("The file is not opened!\n");
		fclose(fin);
		return NULL;
	}

	int nread =0;
	nread = fread(&bf,1,sizeof(BITMAPFILEHEADER),fin);
	if(nread != sizeof(BITMAPFILEHEADER))
	{
		printf("read file header error!\n");
		fclose(fin);
		return NULL;
	}

	nread = fread(&bi,1,sizeof(BITMAPINFOHEADER),fin);
	if(nread != sizeof(BITMAPINFOHEADER))
	{
		printf("read info header error!\n");
		fclose(fin);
		return NULL;
	}
	if(bi.biBitCount != 8)//每个象素占多少bit
	{
		printf("the colors of the image is not 256!\n");
		fclose(fin);
		return NULL;
	}

	nImgWidth=bi.biWidth;
	nImgHeight=bi.biHeight;
	LineBytes=(DWORD)WIDTHBYTES(bi.biWidth*bi.biBitCount);//bmp规定每行占的字节数必须是4的整数倍 
	                                                      //这里如果biwidth=29 30 31 32 都将变成32

	nImgWidth = LineBytes;
	ImgSize=(DWORD)LineBytes*bi.biHeight;
	BYTE* pbyteSrcImg = NULL;
	pbyteSrcImg = new unsigned char[ImgSize];
	assert(pbyteSrcImg != NULL);
    if(bi.biClrUsed!=0)
	{
		NumColors=(DWORD)bi.biClrUsed;
	}
	else
	{
		if(bi.biBitCount == 8)
			NumColors=256;
		else
		{
			printf("Invalid image format!\n");
			fclose(fin);
			return NULL;
        }
	}

	if(bf.bfOffBits!=(DWORD)(NumColors*sizeof(RGBQUAD)+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)))
	{
		fclose(fin);
		return NULL;
	}

	bf.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD)+ImgSize;

	if((hImgData=GlobalAlloc(GHND,(DWORD)ImgSize))==NULL)
	{
	    fclose(fin);
		return NULL;
	}  
	lpImgData = (BYTE*)GlobalLock(hImgData); 
	fseek(fin,sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + NumColors * sizeof(RGBQUAD),SEEK_SET);
	fread(lpImgData,sizeof(unsigned char),ImgSize,fin);

	int i,j;
	for(i=0;i<nImgHeight;i++)
	{
		for(j=0;j<nImgWidth;j++)
		{
			pbyteSrcImg[i*LineBytes+j] = lpImgData[(nImgHeight - i - 1)*LineBytes + j];
		}
	}

	fclose(fin);
	GlobalUnlock(hImgData);
	GlobalFree(hImgData);

	return pbyteSrcImg; 
}
void WriteBmpFile(const char* pszFileName, BYTE* pbyteSrcImg, int nWidth, int nHeight)
{
	BITMAPFILEHEADER bmfHdr;

	int nImgHeight=(nWidth+3)/4*4;
	int imageSize=nImgHeight*nHeight;

	BYTE *saveImage=new BYTE[imageSize];
	memset(saveImage,0,imageSize);
	int i;
	for(i=0;i<nHeight;i++)
		memcpy(saveImage+i*nImgHeight,pbyteSrcImg+(nHeight-i-1)*nWidth,nWidth);//将正序位图数据倒序存储

	bmfHdr.bfType=0x4d42; 
	bmfHdr.bfSize=imageSize+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD); 
	bmfHdr.bfReserved1=0; 
	bmfHdr.bfReserved2=0; 
	bmfHdr.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD); 

	BITMAPINFO *pInfo=(BITMAPINFO*)malloc(sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD));
	pInfo->bmiHeader.biSize=sizeof(BITMAPINFOHEADER); 
	pInfo->bmiHeader.biWidth=nWidth; 
	pInfo->bmiHeader.biHeight=nHeight; 
	pInfo->bmiHeader.biPlanes=1; 
	pInfo->bmiHeader.biBitCount=8; 
	pInfo->bmiHeader.biCompression=BI_RGB; 
	pInfo->bmiHeader.biSizeImage=imageSize; 
	pInfo->bmiHeader.biXPelsPerMeter=0; 
	pInfo->bmiHeader.biYPelsPerMeter=0; 
	pInfo->bmiHeader.biClrUsed=0; 
	pInfo->bmiHeader.biClrImportant=0; 

	for(i=0;i<256;i++)
	{
		pInfo->bmiColors[i].rgbBlue=i;
		pInfo->bmiColors[i].rgbGreen=i;
		pInfo->bmiColors[i].rgbRed=i;
		pInfo->bmiColors[i].rgbReserved=0;
	}

	FILE* mFile = NULL;
	mFile=fopen(pszFileName,"wb");
	if(mFile == NULL)
	{
		AfxMessageBox(_T("the file is not opened!"));
		return;
	}
	fwrite((LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER),1,mFile);
	fwrite(pInfo,sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD),1, mFile);
	fwrite(saveImage,sizeof(BYTE),imageSize,mFile); 
	fclose(mFile);

	free(pInfo);
	delete[]saveImage;
}

⌨️ 快捷键说明

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