📄 draw.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 + -