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

📄 bmp.cpp.svn-base

📁 gif to bmp conversion
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
			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 + -