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

📄 draw.cpp

📁 JPEG解压软件,包含PC端的测试程序,程序结构比较清晰
💻 CPP
字号:
#include <malloc.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

#include "stdafx.h"
#include "resource.h"

#include "AmComDef.h"
#include "AMMemStream.h"
#include "Jpeg.h"
#include "jpegDecoder.h"
#include "Sample.h"
#include "Draw.h"

extern int     gnResampleWidth;
extern int     gnResampleHeight;
extern int     RealWidth ;
extern int     RealHeight ;
extern int     JpegError ;

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


static MBool JPEG_Decompress_CallBack(LPJPG_CALLBACK_PARAM pCallBackParam)
{	
	USER_DATA* pUD = (USER_DATA*)(pCallBackParam->lUserParam);
	MByte	*pData	= MNull;

	if (pCallBackParam->lStatus&JPG_CALLBACK_INIT) {
		//
		// allocate dib and initialize it
		LPBITMAPINFOHEADER pBi;
		int nWidth = (int)(pCallBackParam->lOutWidth);
		int nHeight = (int)(pCallBackParam->lOutHeight);
		int cbLine = BitsRoundTo4Bytes(nWidth * 24);
		int nSizeImage = cbLine * nHeight;
		int nClrUsed = 0;
		int nSize = sizeof(BITMAPINFOHEADER) + nSizeImage;

		if (nSizeImage > pCallBackParam->nextBufferSize)
			pCallBackParam->nextBufferSize	= nSizeImage ;

		pUD->hDib = (long)::GlobalAlloc(GMEM_MOVEABLE, nSize);
		if (!pUD->hDib)
			return MFalse;		

		pBi = (LPBITMAPINFOHEADER)::GlobalLock((HANDLE)(pUD->hDib));
		pUD->pImageData = (MByte*)pBi;

		pBi->biSize			= sizeof(BITMAPINFOHEADER);
		pBi->biWidth		= nWidth;
		pBi->biHeight		= nHeight;
		pBi->biBitCount		= 24;
		pBi->biPlanes		= 1;
		pBi->biCompression	= BI_RGB;
		pBi->biSizeImage	= nSizeImage;
		pBi->biXPelsPerMeter= 300;
		pBi->biYPelsPerMeter= 300;
		pBi->biClrUsed		= 0;
		pBi->biClrImportant	= 0;

		LPBYTE pB = (LPBYTE)pBi + sizeof(BITMAPINFOHEADER);	
		pCallBackParam->pBuffer	= pB + (nHeight-1) * cbLine;
//		memset(pB, 0, pCallBackParam->nextBufferSize);
	}

	else if (pCallBackParam->lStatus&JPG_CALLBACK_RETURNIMGDATA) { 
		//
		// save image data to dib
		LPBITMAPINFOHEADER pBi = (LPBITMAPINFOHEADER)pUD->pImageData;		
		LPBYTE pB = (LPBYTE)pBi + sizeof(BITMAPINFOHEADER);		

		int nWidth = pBi->biWidth;
		int nHeight = pBi->biHeight;
		int cbLine = BitsRoundTo4Bytes(nWidth * 24);

//		LPBYTE pTmp = pB + (nHeight-pCallBackParam->lStartLine-1)*cbLine;
//		LPBYTE pLine = pCallBackParam->pBuffer;
		MLong endLine = pCallBackParam->lStartLine+pCallBackParam->lLineCount;
/*
		for (int y=0; y<(endLine-pCallBackParam->lStartLine); y++) {
			memset(pTmp, 0, cbLine);
			memcpy(pTmp, pLine, pCallBackParam->lLineBytes);	
			pTmp -= cbLine;
			pLine += pCallBackParam->lLineBytes;
		}
*/		//memset(pCallBackParam->pBuffer, 0, pCallBackParam->nextBufferSize);
		pData	= pB;
		pUD->PixelsNum	+= (nHeight-pCallBackParam->lStartLine-1)*cbLine;
		{
			int i;
			for(i = 0; i < ((nHeight-pCallBackParam->lStartLine-1)*cbLine); i ++)
			{
				pUD->RValue		+= *pData++;
				pUD->GValue		+= *pData++;
				pUD->BValue		+= *pData++;
			}
		}

		pCallBackParam->pBuffer = pB + (nHeight-endLine-1) * cbLine;
	}

	else if (pCallBackParam->lStatus&JPG_CALLBACK_END) {
		//
		// unlock the buffer 
		if (pUD->pImageData)
			::GlobalUnlock((HANDLE)(pUD->hDib));

	}

	return 1;
}

CDraw::CDraw()
{	
}

CDraw::~CDraw()
{	
}

HANDLE CDraw::DrawJPEG(LPCSTR pstrFilePath, USER_DATA* pUserData, int *pTotalTime)
{
	MLong ret;
	JPG_INFO JPGInfo ;

	pUserData->BValue		= 0;
	pUserData->GValue		= 0;
	pUserData->RValue		= 0;
	pUserData->PixelsNum	= 0;

	TCHAR szDrive[MAX_PATH],szDir[MAX_PATH],szFName[MAX_PATH],szExt[MAX_PATH];
	_tsplitpath(pstrFilePath,szDrive,szDir,szFName,szExt);
	strcat(szDrive,szDir);
	strcat(szFName, szExt);

	int nBegin = ::GetTickCount();

	HMSTREAM stream_handle	= AMStreamOpenFromFile(szDrive, szFName,STREAM_READ);
	ret = JPG_Decompress(stream_handle, gnResampleWidth, gnResampleHeight, JPEG_Decompress_CallBack, FALSE, (MLong)pUserData);

	AMStreamClose(stream_handle);

	int nEnd = ::GetTickCount();
	*pTotalTime = nEnd - nBegin + 1 ;

	JpegError	= ret ;

	stream_handle	= AMStreamOpenFromFile(szDrive, szFName,STREAM_READ);
	JPG_GetInfo( stream_handle, &JPGInfo ) ;
	AMStreamClose(stream_handle);

	RealWidth	= JPGInfo.lWidth ;
	RealHeight	= JPGInfo.lHeight ;

	if (!ret)
		return (HANDLE)pUserData->hDib;
	else
		return NULL;
}

⌨️ 快捷键说明

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