📄 bmp.cpp.svn-base
字号:
pOut->iTop = iIntersectTop;
pOut->uiWidth = iIntersectRight - iIntersectLeft;
pOut->uiHeight = iIntersectBottom - iIntersectTop;
}
return bReturn;
}
static void BmpBufAppendRaster8BitVersion(ST_GIF_ATTRIBUTE* pstGifAttribute, JC_UINT8* pmBuf, JC_INT32 iFrame)
{
JC_UINT32 uiRowStart;
JC_UINT32 uiAllignedWidth;
JC_INT32 iJ;
JC_INT32 iPaddingByte;
const JC_UINT8 aucPadding[4] = {0x00, 0x00, 0x00, 0x00};
uiAllignedWidth = ((pstGifAttribute->ppstFrameAttribute[iFrame]->iFrameWidth + 3) / 4) * 4;
iPaddingByte = uiAllignedWidth - pstGifAttribute->ppstFrameAttribute[iFrame]->iFrameWidth;
jc_memcpy(pmBuf,pstGifAttribute->ppstFrameAttribute[iFrame]->pucFramePalette ,pstGifAttribute->ppstFrameAttribute[iFrame]->iNumPalette * 4);
pmBuf = pmBuf + pstGifAttribute->ppstFrameAttribute[iFrame]->iNumPalette * 4;
for(iJ = 0; iJ < pstGifAttribute->ppstFrameAttribute[iFrame]->iFrameHeight; iJ++)
{
uiRowStart = (pstGifAttribute->ppstFrameAttribute[iFrame]->iFrameHeight - iJ) * pstGifAttribute->ppstFrameAttribute[iFrame]->iFrameWidth;
jc_memcpy(pmBuf,pstGifAttribute->ppstFrameAttribute[iFrame]->pucFrameRaster + uiRowStart,pstGifAttribute->ppstFrameAttribute[iFrame]->iFrameWidth);
pmBuf = pmBuf + pstGifAttribute->ppstFrameAttribute[iFrame]->iFrameWidth;
jc_memcpy(pmBuf,aucPadding,iPaddingByte);
pmBuf = pmBuf + iPaddingByte;
}
}
static void BmpBufAppendRaster24BitVersion(ST_GIF_ATTRIBUTE* pstGifAttribute, JC_UINT8* pmBuf, JC_INT32 iFrame)
{
JC_INT32 iI;
JC_INT32 iJ;
JC_INT32 iCorrectedX;
JC_INT32 iCorrectedY;
JC_UINT32 uiAlignedRowStride;
JC_INT32 iPaddingByte;
ST_RGBA stRgba;
ST_FRAME_ATTRIBUTE* lpCurFrame;
JC_INT32 iCurColorIndex;
const JC_UINT8 aucPadding[4] = {0x00, 0x00, 0x00, 0x00};
lpCurFrame = pstGifAttribute->ppstFrameAttribute[iFrame];
uiAlignedRowStride = ((pstGifAttribute->iScreenWidth * 24 + 31) / 32) * 4;
iPaddingByte = uiAlignedRowStride - pstGifAttribute->iScreenWidth * 3;
for(iJ = (pstGifAttribute->iScreenHeight - 1); iJ >= 0; iJ--)
{
for(iI = 0; iI < pstGifAttribute->iScreenWidth; iI++)
{
iCorrectedX = iI - lpCurFrame->stPosition.iX;
iCorrectedY = iJ - lpCurFrame->stPosition.iY;
if(iCorrectedX < 0 || iCorrectedY < 0)
{
BmpGetColorFromPreviousFrame( iI, iJ, iFrame-1, pstGifAttribute, &stRgba);
}
else if(iCorrectedX >= lpCurFrame->iFrameWidth || iCorrectedY >= lpCurFrame->iFrameHeight)
{
BmpGetColorFromPreviousFrame( iI, iJ, iFrame-1, pstGifAttribute, &stRgba);
}
else
{
iCurColorIndex = lpCurFrame->pucFrameRaster[iCorrectedY * lpCurFrame->iFrameWidth + iCorrectedX];
if(lpCurFrame->iFrameTransparency && iCurColorIndex == lpCurFrame->iFrameTransparent)
{
BmpGetColorFromPreviousFrame( iI, iJ, iFrame-1, pstGifAttribute, &stRgba);
}
else
{
stRgba.ucR = lpCurFrame->pucFramePalette[iCurColorIndex * 4];
stRgba.ucG = lpCurFrame->pucFramePalette[iCurColorIndex * 4 + 1];
stRgba.ucB = lpCurFrame->pucFramePalette[iCurColorIndex * 4 + 2];
stRgba.ucA = 0;
}
}
jc_memcpy(pmBuf,&stRgba,3);
pmBuf = pmBuf + 3;
}
jc_memcpy(pmBuf,&aucPadding,iPaddingByte);
pmBuf = pmBuf + iPaddingByte;
}
}
/***************************************************************************
* All Global Function Definitions
**************************************************************************/
/**
* @brief Creates the bmp file
* @param[in] pstGifAttribute pointer to the ST_GIF_ATTRIBUTE structure
* @param[in] pfilename char pointer to the bmp file name
* @param[in] iFrame frame no of the bmp file
* @retval JC_OK on success
* @retval JC_ERR_INVALID_PARAMETER on error
* @retval JC_ERR_FILE_OPEN on error
*/
JC_RETCODE jdi_BmpCreateFile(ST_GIF_ATTRIBUTE* pstGifAttribute, const JC_CHAR* pfilename, JC_INT32 iFrame)
{
JC_INT32 iBitsPerPixel;
JDD_FILE oFile;
JDD_FSHANDLE fsHandle = JC_NULL ;
jdd_FSInitialize (&fsHandle) ;
JC_RETCODE rCode = JC_OK ;
if ( JC_NULL != pstGifAttribute && JC_NULL != pfilename)
{
oFile = jdd_FSOpen(fsHandle, pfilename, E_CREATE_WRITE_READ_MODE);
if (JC_NULL != oFile)
{
ST_BMPFILEHEADER stBitMapFileHeader;
ST_BMPINFOHEADER stBitMapInfoHeader;
iBitsPerPixel = 8;
if((pstGifAttribute->ppstFrameAttribute[iFrame]->iFrameWidth != pstGifAttribute->iScreenWidth) || (pstGifAttribute->ppstFrameAttribute[iFrame]->iFrameHeight != pstGifAttribute->iScreenHeight))
{
iBitsPerPixel = 24;
}
else if(pstGifAttribute->ppstFrameAttribute[iFrame]->iFrameTransparency)
{
iBitsPerPixel = 24;
}
rCode = BmpFillBitmapFileHeader(&stBitMapFileHeader, iBitsPerPixel, pstGifAttribute, iFrame);
if (JC_OK == rCode)
{
rCode = BmpFillBitmapInfoHeader(&stBitMapInfoHeader, iBitsPerPixel, pstGifAttribute, iFrame);
BmpWriteBitmapFileHeader(&stBitMapFileHeader, oFile);
jdd_FSWrite(&stBitMapInfoHeader, 1, BMP_FILEINFOHEADER, oFile);
if (iBitsPerPixel == 8)
{
BmpAppendRaster8BitVersion(pstGifAttribute, oFile, iFrame);
}
else
{
BmpAppendRaster24BitVersion(pstGifAttribute, oFile, iFrame);
}
jdd_FSClose(oFile);
}
}
else
{
rCode = JC_ERR_FILE_OPEN ;
}
}
else
{
rCode = JC_ERR_INVALID_PARAMETER ;
}
return rCode;
}
/**
* @brief To get the partial image of the bmp file according to the JC_RECT structure
* @param[in] pfilename pointer to the bmp file name from which extraction is done
* @param[out] pszOutFile Pointer to the partial bmp image
* @retval JC_OK on success
* @retval JC_ERR_INVALID_PARAMETER on error
* @retval JC_ERR_FILE_OPEN on error
*/
JC_RETCODE jdi_BmpExtractPortion(const JC_CHAR* pfilename, const JC_CHAR* pszOutFile, JC_RECT *pRect)
{
JDD_FILE vFile;
JDD_FILE vFileout;
JC_UINT8 aucColor[4];
JC_UINT8 aucPalette[4 * 256];
JC_UINT8 aucPadding[] = {0x00, 0x00, 0x00, 0x00};
JC_INT32 iI;
JC_INT32 iJ;
JC_INT32 iDstRowStride;
JC_INT32 iSrcRowStride;
JC_INT32 ipaddingbyte;
JC_INT32 iNumPallete ;
JC_RECT stOutRect;
ST_BMPFILEHEADER stBitMapFileHeader;
ST_BMPINFOHEADER stBitMapInfoHeader;
JDD_FSHANDLE fsHandle = JC_NULL ;
jdd_FSInitialize (&fsHandle) ;
JC_RETCODE rCode = JC_OK ;
if ( JC_NULL != pfilename && JC_NULL != pszOutFile && JC_NULL != pRect)
{
vFile = jdd_FSOpen(fsHandle, pfilename, E_OPEN_READ_MODE);
vFileout = jdd_FSOpen(fsHandle, pszOutFile, E_CREATE_WRITE_READ_MODE);
if (JC_NULL != vFile && JC_NULL != vFileout)
{
jdd_FSRead(&stBitMapFileHeader.hFileType, 1, 2, vFile);
jdd_FSRead(&stBitMapFileHeader.uiFileSize, 1, 4, vFile);
jdd_FSRead(&stBitMapFileHeader.hFlieReserved1, 1, 2, vFile);
jdd_FSRead(&stBitMapFileHeader.hFlieReserved2, 1, 2, vFile);
jdd_FSRead(&stBitMapFileHeader.uiFlieOffBits, 1, 4, vFile);
jdd_FSRead(&stBitMapInfoHeader, 1, BMP_FILEINFOHEADER, vFile);
iSrcRowStride = ((stBitMapInfoHeader.uiWidth * stBitMapInfoHeader.hBitCount + 31) / 32) * 4;
stOutRect.iLeft = stOutRect.iTop = 0;
stOutRect.uiWidth = stBitMapInfoHeader.uiWidth;
stOutRect.uiHeight = stBitMapInfoHeader.uiHeight;
if (!BmpIntersectRect(&stOutRect, pRect))
{
rCode = JC_ERR_INVALID_PARAMETER;
}
else
{
stBitMapInfoHeader.uiWidth = stOutRect.uiWidth;
stBitMapInfoHeader.uiHeight = stOutRect.uiHeight;
BmpWriteBitmapFileHeader(&stBitMapFileHeader, vFileout);
jdd_FSWrite(&stBitMapInfoHeader, 1, BMP_FILEINFOHEADER, vFileout);
iDstRowStride = ((stBitMapInfoHeader.uiWidth * stBitMapInfoHeader.hBitCount + 31) / 32) * 4;
ipaddingbyte = iDstRowStride - stBitMapInfoHeader.uiWidth * stBitMapInfoHeader.hBitCount / 8;
if (stBitMapInfoHeader.hBitCount == 8)
{
iNumPallete = stBitMapInfoHeader.uiClrUsed;
if(!iNumPallete)
iNumPallete = BMP_DEFAULT_PALETTECOUNT;
jdd_FSRead (aucPalette, 1, 4 * iNumPallete, vFile);
jdd_FSWrite(aucPalette, 1, 4 * iNumPallete, vFileout);
}
for (iJ = 0; iJ < (JC_INT32)stOutRect.uiHeight; iJ++)
{
for (iI = 0; iI < (JC_INT32)stOutRect.uiWidth; iI++)
{
jdd_FSRead(aucColor, 1, stBitMapInfoHeader.hBitCount/ 8, vFile);
jdd_FSWrite(aucColor, 1, stBitMapInfoHeader.hBitCount/ 8, vFileout);
}
jdd_FSWrite(aucPadding, 1, ipaddingbyte, vFileout);
jdd_FSSeek(vFile, iSrcRowStride - (stBitMapInfoHeader.hBitCount / 8) * stOutRect.uiWidth, E_FILE_SEEK_CUR);
}
}
}
else
{
rCode = JC_ERR_FILE_OPEN ;
}
if (vFile)
{
jdd_FSClose(vFile);
}
if (vFileout)
{
jdd_FSClose(vFileout);
}
}
else
{
rCode = JC_ERR_INVALID_PARAMETER ;
}
return rCode;
}
/**
* @brief Creates the bmp buffer when size of the output bmp image is less then 4KB
* @param[in] pstGifAttribute pointer to the ST_GIF_ATTRIBUTE structue
* @param[in] pucBmpBuf Pointer to the buffer which is already allocated space in the
* connection handle that is passed to the other data
* structure ST_GIF_DATA
* @retval JC_OK on success
*/
JC_RETCODE jdi_BmpCreateBuffer(ST_GIF_ATTRIBUTE* pstGifAttribute,JC_UINT8 * pucBmpBuf, JC_INT32 iBufSize, JC_INT32 iFrame)
{
JC_INT32 iBitsPerPixel;
JC_UINT8 *pucBuf;
ST_BMPFILEHEADER stBitMapFileHeader;
ST_BMPINFOHEADER stBitMapInfoHeader;
pucBuf = pucBmpBuf;
iBitsPerPixel = 8;
if((pstGifAttribute->ppstFrameAttribute[iFrame]->iFrameWidth != pstGifAttribute->iScreenWidth) || (pstGifAttribute->ppstFrameAttribute[iFrame]->iFrameHeight != pstGifAttribute->iScreenHeight))
iBitsPerPixel = 24;
else if(pstGifAttribute->ppstFrameAttribute[iFrame]->iFrameTransparency)
iBitsPerPixel = 24;
BmpFillBitmapFileHeader(&stBitMapFileHeader, iBitsPerPixel, pstGifAttribute, iFrame);
jc_memcpy(pucBuf,&stBitMapFileHeader,2);
pucBuf = pucBuf + 2;
jc_memcpy(pucBuf,&stBitMapFileHeader.uiFileSize,4);
pucBuf = pucBuf + 4;
jc_memcpy(pucBuf,&stBitMapFileHeader.hFlieReserved1,2);
pucBuf = pucBuf + 2;
jc_memcpy(pucBuf,&stBitMapFileHeader.hFlieReserved2,2);
pucBuf = pucBuf + 2;
jc_memcpy(pucBuf,&stBitMapFileHeader.uiFlieOffBits,4);
pucBuf = pucBuf + 4;
BmpFillBitmapInfoHeader(&stBitMapInfoHeader, iBitsPerPixel, pstGifAttribute, iFrame);
jc_memcpy(pucBuf,&stBitMapInfoHeader,BMP_FILEINFOHEADER);
pucBuf = pucBuf + BMP_FILEINFOHEADER;
if (iBitsPerPixel == 8)
{
BmpBufAppendRaster8BitVersion(pstGifAttribute, pucBuf, iFrame);
}
else
{
BmpBufAppendRaster24BitVersion(pstGifAttribute, pucBuf, iFrame);
}
return JC_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -