亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tga.cpp

?? 《精通 vc++ 圖像編程》的源代碼
?? CPP
字號:
// Tga.cpp: implementation of the CTga class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Tga.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CTga::CTga()
{
	m_pDib = NULL;
}

CTga::CTga(CDib *pDib)
{
	m_pDib = NULL;
	SetDib(pDib);
}

CTga::~CTga()
{
	if (m_pDib != NULL)
		delete m_pDib;
}

BOOL CTga::Load(LPCTSTR lpstrFileName)
{
	CFile file;
	if (! file.Open(lpstrFileName, CFile::modeRead))
		return FALSE;

	HDIB hDIB = ReadTGAFile(file);

	file.Close();

	// create DIB
	if (m_pDib != NULL)
		delete m_pDib;

	m_pDib = new CDib();
	m_pDib->Attach(hDIB);

	return TRUE;
}

BOOL CTga::Save(LPCTSTR lpstrFileName, CDib* pDib)
{
	if (pDib == NULL)
		pDib = m_pDib;
	if (pDib == NULL)
		return FALSE;

	CDib *pTmpDib = pDib->Clone();

	if (pTmpDib->GetBitCount() != 24)
	{
		pTmpDib->ConvertFormat(24);
	}

	HDIB hDIB = pTmpDib->GetHandle();
	if (hDIB == NULL)
	{
		delete pTmpDib;
		return FALSE;
	}

	CFile file;
	if (! file.Open(lpstrFileName, CFile::modeCreate | CFile::modeWrite))
	{
		delete pTmpDib;
		return FALSE;
	}

	if (! SaveTGAFile(hDIB, file))
	{
		delete pTmpDib;
		return FALSE;
	}

	file.Close();
	delete pTmpDib;

	return TRUE;
}

/*************************************************************************
*
*  Function:  ReadTGAFile (CFile&)
*  
*  Purpose:  Reads in the specified targe file into a global chunk of
* 	  	     memory.
*          
*            Returns:  A handle to a dib (hDIB) if successful.
*            NULL if an error occurs.
*              
**************************************************************************/
          
HDIB CTga::ReadTGAFile(CFile& file)
{
  //Determine if the file is in the original TGA format
  //or the new TGA format i.e. post September 1989
  DWORD dwFileLength = file.GetLength();
  if (dwFileLength == 0)
    return NULL;
  file.Seek(dwFileLength - sizeof(TGA_FILE_FOOTER), CFile::begin);
  TGA_FILE_FOOTER fileFooter;
  file.Read(&fileFooter, sizeof(TGA_FILE_FOOTER));
  BOOL bNewTGAFormat = FALSE;
  if (strcmp(fileFooter.cSignature, "TRUEVISION-XFILE.") == 0)
    bNewTGAFormat = TRUE;

  //Read in the TGA file header
  TGA_FILE_HEADER fileHeader;                  
  file.SeekToBegin();
  file.Read(&fileHeader, sizeof(TGA_FILE_HEADER));

  //We only support 32 and 24 bit color depths
  if ((fileHeader.byPixelDepth != 32) &&
      (fileHeader.byPixelDepth != 24))
  {
    TRACE(_T("Bit depth is %d, which cannot be handled\n"), fileHeader.byPixelDepth);
    return NULL;
  }

  //now read in the image data
  if (fileHeader.byImageType != 2)
  {
    TRACE(_T("Image type is not an uncompressed true-color image, instead it is %d\n"), fileHeader.byImageType);
    return NULL;
  }

  //check that the Color map type is 0
  if (fileHeader.byColorMapType != 0)
  {
    TRACE(_T("Color map type is non zero in the TGA file header for this uncompressed true-color tga file, instead it is %d\n"), fileHeader.byColorMapType);
    return NULL;
  }      

  //Determine the end offset of the "Image Data"
  DWORD dwEndImageData = 0;
  if (bNewTGAFormat)
    dwEndImageData = fileFooter.lExtensionAreaOffset - 1;
  else
    dwEndImageData = dwFileLength;

  //Determine the start offset of the "Image Data" and the pointer to 
  //the color map
  DWORD dwStartImageData = sizeof(TGA_FILE_HEADER) + fileHeader.byIdLength;

  //Read in the image data
  DWORD dwImageSize = dwEndImageData - dwStartImageData;
  BYTE* pImageData = new BYTE[dwImageSize];
  file.Seek(dwStartImageData, CFile::begin);
  file.Read(pImageData, dwImageSize);

  // initializing incapsulated image with correct values
  BITMAPINFO bmi;
  BITMAPINFOHEADER& bih = bmi.bmiHeader;
  ZeroMemory(&bih, sizeof(BITMAPINFOHEADER));
  bih.biSize = sizeof(BITMAPINFOHEADER);
  bih.biWidth = fileHeader.nImageWidth;
  bih.biHeight = fileHeader.nImageHeight;
  bih.biCompression = BI_RGB;
  bih.biPlanes = 1;
  bih.biBitCount = 24;

  //Allocate a buffer to use for the transfer to DIB format
  DWORD imageSize = fileHeader.nImageHeight*(fileHeader.nImageWidth*3+((4-((fileHeader.nImageWidth*3)&3))&3));
  BYTE* pBmp = new BYTE[imageSize];

  //Determine the up/down and left/right ordering of the pixels
  BOOL bTopToBottom = (((fileHeader.byImageDescriptor >> 4) & 1) != 0);
  BOOL bLeftToRight = (((fileHeader.byImageDescriptor >> 5) & 1) != 0);

  //Copy the DIB bits from the user buffer into the DIB
  int nInBytesPerPel = fileHeader.byPixelDepth / 8;

  for (int j=0; j<fileHeader.nImageHeight; j++)
  {
    int nDepthInOffset = 0;
    if (bTopToBottom)
      nDepthInOffset = (fileHeader.nImageHeight - j - 1)*fileHeader.nImageWidth*nInBytesPerPel;
    else
      nDepthInOffset = j*fileHeader.nImageWidth*nInBytesPerPel;

    int nDepthOutOffset = j*WIDTHBYTES(fileHeader.nImageWidth*24);

    for (int i=0; i<fileHeader.nImageWidth; i++)
    {
      int nInOffset = 0;
      if (bTopToBottom)
      {
        if (bLeftToRight)
          nInOffset = nDepthInOffset + (fileHeader.nImageWidth - i - 1)*nInBytesPerPel;
        else
          nInOffset = nDepthInOffset + i*nInBytesPerPel;
      }
      else
      {
        if (bLeftToRight)
          nInOffset = nDepthInOffset + (fileHeader.nImageWidth - i - 1)*nInBytesPerPel;
        else
          nInOffset = nDepthInOffset + i*nInBytesPerPel;
      }

      int nOutOffset = nDepthOutOffset + i*3;

      if (nInBytesPerPel == 3 || nInBytesPerPel == 4)
      {
        pBmp[nOutOffset]   = pImageData[nInOffset];
        pBmp[nOutOffset+1] = pImageData[nInOffset+1];
        pBmp[nOutOffset+2]  = pImageData[nInOffset+2];
      }
      else
      {
        ASSERT(FALSE);
        break;
      }
    }
  }

  //Delete the memory used to load the targe prior to transfering to the DIB
	delete [] pImageData;

  // Allocate memory for DIB
  HDIB hDIB = (HDIB) ::GlobalAlloc(GHND, bih.biSize + imageSize);
  if (hDIB == 0)
  {
	  delete [] pBmp;
    return NULL;
  }
  LPSTR pDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
  if (pDIB == 0)
  {
	  delete [] pBmp;
    return NULL;
  }

  CopyMemory(pDIB, &bmi.bmiHeader, bih.biSize);
  CopyMemory(pDIB + bih.biSize, pBmp, imageSize);
  delete [] pBmp;

  ::GlobalUnlock((HGLOBAL) hDIB);
  return hDIB;
}

/*************************************************************************
*
* SaveTGAFile()
*
* Saves the specified DIB as a Targa into the specified CFile.  The CFile
* is opened and closed by the caller.
*
* Parameters:
*
* HDIB hDib - Handle to the dib to save
*
* CFile& file - open CFile used to save as Targa
*
* Return value: TRUE if successful, else FALSE or CFileException
*
*************************************************************************/

BOOL CTga::SaveTGAFile(HDIB hDib, CFile& file)
{
  BOOL bSuccess = TRUE;

  //No bitmap, then cannot save
  if (hDib == NULL)
    return FALSE;

  // Get a pointer to the DIB memory, the first of which contains
  // a BITMAPINFO structure
  LPBITMAPINFOHEADER lpBI = (LPBITMAPINFOHEADER) ::GlobalLock((HGLOBAL) hDib);
  if (lpBI == NULL)
    return FALSE;
   
  if (!IS_WIN30_DIB(lpBI))
  {
    TRACE(_T("Only Windows 3.0 DIB images can be saved as Targa!\n"));
    ::GlobalUnlock((HGLOBAL) hDib);
    return FALSE;  // It's an other-style DIB (save not supported)
  }

  if (lpBI->biBitCount != 24)
  {
    TRACE(_T("Only 16 million colors (24 bit) images can be saved as Targa!\n"));
    ::GlobalUnlock((HGLOBAL) hDib);
    return FALSE;
  }

  if (lpBI->biCompression != BI_RGB)
  {
    TRACE(_T("RLE-compressed images can't be saved as Targa!\n"));
    ::GlobalUnlock((HGLOBAL) hDib);
    return FALSE;
  }

  DWORD dwDIBSize = *(LPDWORD)lpBI + ::PaletteSize((LPSTR)lpBI);  // Partial Calculation

  // Now calculate the size of the image

  DWORD dwBmBitsSize;  // Size of Bitmap Bits only
  // It's not RLE, so size is Width (DWORD aligned) * Height
  dwBmBitsSize = WIDTHBYTES(lpBI->biWidth*((DWORD)lpBI->biBitCount)) * lpBI->biHeight;
  dwDIBSize += dwBmBitsSize;

  // Now, since we have calculated the correct size, why don't we
  // fill in the biSizeImage field (this will fix any .BMP files which
  // have this field incorrect).
  lpBI->biSizeImage = dwBmBitsSize;

  TRY
  {
    //First write out the header
    TGA_FILE_HEADER fileHeader;                  
    ZeroMemory(&fileHeader, sizeof(TGA_FILE_HEADER));
    fileHeader.byImageType = 2;
    fileHeader.nImageWidth = (short) lpBI->biWidth;
    fileHeader.nImageHeight = (short) lpBI->biHeight;
    fileHeader.byPixelDepth = 24;
    file.SeekToBegin();
    file.Write(&fileHeader, sizeof(TGA_FILE_HEADER));

    //Allocate some memory to save the Dib bits into 
    BYTE* pImageData = (BYTE*)lpBI + lpBI->biSize;
    DWORD dwImageDataSize = lpBI->biWidth*lpBI->biHeight*3;
    BYTE* pBmp = new BYTE[dwImageDataSize];

    //Copy the Dib bits into the buffer we just allocated
    for (int j=0; j<lpBI->biHeight; j++)
    {
      int nDepthOffset = j*WIDTHBYTES(lpBI->biWidth*24);
      for (int i=0; i<lpBI->biWidth; i++)
      {
        int nOutputOffset = j*lpBI->biWidth*3 + i*3;
        int nInputOffset = nDepthOffset + i*3;
	      pBmp[nOutputOffset]	    = pImageData[nInputOffset];
	      pBmp[nOutputOffset+1]	= pImageData[nInputOffset+1];
	      pBmp[nOutputOffset+2]	= pImageData[nInputOffset+2];
      }
    }

    ::GlobalUnlock((HGLOBAL)hDib);

    //Write the image data to disk
    file.Write(pBmp, dwImageDataSize);

    //Free up the memory we used
    delete [] pBmp;
  }
  CATCH_ALL(e)
  {
    bSuccess = FALSE;
    TRACE(_T("Error storing TGA file!\n"));
  }
  END_CATCH_ALL

  return bSuccess;
}



?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
看国产成人h片视频| 午夜精品福利久久久| 日韩一卡二卡三卡| 91欧美一区二区| 亚洲一区二区三区四区五区黄| 久久午夜羞羞影院免费观看| 欧美成人免费网站| 久久精子c满五个校花| 国产亚洲精品bt天堂精选| 国产欧美日韩不卡免费| 国产精品久久久久婷婷| 亚洲一区在线观看免费观看电影高清| 中文字幕在线不卡| 亚洲一区二区在线免费看| 成人欧美一区二区三区小说| 夜夜夜精品看看| 免费精品视频最新在线| 九九九精品视频| 欧美日韩午夜在线| 精品电影一区二区| 亚洲一区二区三区自拍| 老司机午夜精品99久久| 色偷偷久久一区二区三区| 欧美一级黄色大片| 中文字幕一区三区| 国内成人免费视频| 3d动漫精品啪啪一区二区竹菊| 久久综合999| 麻豆91小视频| 在线亚洲+欧美+日本专区| 精品99一区二区| 免费黄网站欧美| 欧美一区二区三区喷汁尤物| 亚洲国产视频一区二区| 97久久超碰国产精品电影| 日韩免费高清av| 免费观看久久久4p| 日韩欧美aaaaaa| 午夜激情一区二区三区| 欧美无砖砖区免费| 亚洲色图在线播放| 国产精品一区二区你懂的| 日韩一区二区三区在线视频| 亚洲v中文字幕| 91精品国产色综合久久| 日韩中文欧美在线| 久久伊人蜜桃av一区二区| 久久精品国产99国产精品| 亚洲精品一区二区三区香蕉| 免费在线看一区| 国产精品久久久久7777按摩| 在线一区二区三区| 久久99国产精品久久99果冻传媒| 精品国产免费久久| 色欧美日韩亚洲| 国产成人福利片| 亚洲午夜精品网| 中文字幕免费一区| 在线播放日韩导航| 91色婷婷久久久久合中文| 日韩黄色在线观看| 亚洲亚洲人成综合网络| 久久精品在线免费观看| 69堂成人精品免费视频| 欧美色综合网站| 色综合天天综合色综合av | www.成人在线| 亚洲一区二区av在线| 国产精品女同互慰在线看| 精品久久国产老人久久综合| 欧美日免费三级在线| 9人人澡人人爽人人精品| 国产99精品国产| 国产久卡久卡久卡久卡视频精品| 亚洲.国产.中文慕字在线| 中文字幕亚洲一区二区va在线| 亚洲精品在线观看网站| 欧美精品一区二区精品网| 日韩欧美国产成人一区二区| 日韩视频在线你懂得| 欧美日韩成人综合天天影院| 国产成+人+日韩+欧美+亚洲| 日韩电影免费一区| 久久se这里有精品| 成人小视频在线| 国产福利一区二区三区视频| 韩国视频一区二区| 成人手机在线视频| 成人精品在线视频观看| 在线观看一区二区精品视频| 4438x成人网最大色成网站| 欧美va天堂va视频va在线| 国产精品久久三| 三级不卡在线观看| 一本久道久久综合中文字幕| 宅男噜噜噜66一区二区66| 久久久一区二区三区捆绑**| 亚洲卡通动漫在线| 成人av免费观看| 精品国产髙清在线看国产毛片| 亚洲欧美日韩久久| 国产毛片一区二区| 亚洲超碰精品一区二区| 91无套直看片红桃| 国产精品欧美极品| 国产91精品久久久久久久网曝门| 欧美亚洲图片小说| 久久久久一区二区三区四区| 亚洲欧美日韩国产综合| 国内精品不卡在线| 欧美在线观看一区| 综合av第一页| 91视视频在线观看入口直接观看www | 极品少妇xxxx精品少妇偷拍| 91香蕉视频黄| 日本一区二区不卡视频| 粉嫩绯色av一区二区在线观看| 日韩免费一区二区| 国产成人精品免费网站| 国产精品不卡视频| 色婷婷狠狠综合| 日韩avvvv在线播放| 久久久噜噜噜久噜久久综合| 国产一区二区调教| 一区二区三区在线免费观看| 欧洲视频一区二区| 精品在线一区二区| 中文字幕亚洲一区二区va在线| 日本久久电影网| 蜜乳av一区二区| 亚洲欧洲日韩综合一区二区| 欧美三片在线视频观看| 国产中文字幕精品| 亚洲小少妇裸体bbw| 久久久777精品电影网影网| 色婷婷精品大视频在线蜜桃视频| 日本成人超碰在线观看| 亚洲色图.com| 精品国产百合女同互慰| 国产精品一区在线| 亚洲成人自拍一区| 亚洲男人的天堂网| 亚洲欧美综合另类在线卡通| 精品电影一区二区| 精品久久久久av影院| 91豆麻精品91久久久久久| 国产精品69久久久久水密桃| 日韩成人精品在线观看| 亚洲综合色区另类av| 亚洲人成网站影音先锋播放| wwwwww.欧美系列| 337p粉嫩大胆色噜噜噜噜亚洲| 色婷婷亚洲精品| 欧美一级免费观看| 国产三级欧美三级| 在线成人av网站| 久久久欧美精品sm网站| 国产精品91一区二区| 蜜桃av一区二区三区电影| 五月婷婷激情综合网| 一区二区三区欧美日| 亚洲欧美国产高清| 一区二区三区不卡视频在线观看| 国产清纯白嫩初高生在线观看91| www国产亚洲精品久久麻豆| 日韩一区二区三区视频在线观看| 91精品婷婷国产综合久久竹菊| 91福利视频网站| 欧美专区亚洲专区| 8v天堂国产在线一区二区| 欧美成人一级视频| 中文在线资源观看网站视频免费不卡| 国产精品系列在线| 亚洲欧美另类图片小说| 天天综合色天天综合| 美女视频免费一区| 成人午夜精品在线| 91视频你懂的| 日韩一区二区三区高清免费看看| 欧美精品一区二区三区视频| 国产精品久久久久久久浪潮网站 | 欧美精品一二三| 日韩精品一区二区三区四区 | 丰满白嫩尤物一区二区| 一本到不卡免费一区二区| 69p69国产精品| 国产精品免费丝袜| 婷婷综合五月天| 国产91丝袜在线播放九色| 在线中文字幕一区二区| 日韩亚洲电影在线| 亚洲日本va在线观看| 日本午夜精品视频在线观看 | 亚洲 欧美综合在线网络| 国产毛片精品国产一区二区三区| av中文字幕不卡| 精品三级在线看| 又紧又大又爽精品一区二区| 韩国精品主播一区二区在线观看| 日本高清不卡aⅴ免费网站|