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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? 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;
}



?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品高清在线观看| 欧美中文字幕一二三区视频| 91.麻豆视频| 亚洲精品网站在线观看| 国产精品夜夜嗨| 国产香蕉久久精品综合网| 国产自产v一区二区三区c| 欧美一级专区免费大片| 日韩专区欧美专区| 91精品国产一区二区三区香蕉| 亚洲精品乱码久久久久久黑人| 日本精品一区二区三区高清| 亚洲欧美日韩中文字幕一区二区三区 | 91超碰这里只有精品国产| 亚洲图片欧美色图| 欧美日韩中文字幕精品| 婷婷开心久久网| 精品久久久久久无| 99久久综合狠狠综合久久| 一区二区三区美女| 日韩欧美在线不卡| 国产精品亚洲视频| 免费观看91视频大全| 精品99一区二区三区| 97se亚洲国产综合自在线不卡| 一区二区三区四区不卡视频| 国产蜜臀av在线一区二区三区| 国内精品久久久久影院一蜜桃| 亚洲欧洲成人精品av97| 欧美高清视频不卡网| 成人91在线观看| 伦理电影国产精品| 亚洲精品美国一| 欧美激情在线免费观看| 51精品视频一区二区三区| 成人教育av在线| 国产尤物一区二区| 日韩国产精品大片| 亚洲综合图片区| 欧美激情一区二区三区蜜桃视频| 7777精品伊人久久久大香线蕉完整版 | 国产精品无码永久免费888| 欧美不卡一区二区三区四区| 精品视频一区 二区 三区| 在线这里只有精品| 色呦呦国产精品| 成年人网站91| kk眼镜猥琐国模调教系列一区二区| 国产伦精品一区二区三区免费迷| 亚洲高清一区二区三区| 欧美日韩久久久久久| 99久久免费精品| 91同城在线观看| 韩国欧美一区二区| 免费观看在线色综合| 香港成人在线视频| 亚洲成人自拍偷拍| 国产精品天天摸av网| 精品国产一区二区三区四区四| 欧美日韩色一区| 欧美日韩国产中文| 一本一本久久a久久精品综合麻豆| 成人激情免费网站| 激情综合网激情| 亚洲综合色噜噜狠狠| 玉米视频成人免费看| 亚洲精品乱码久久久久久 | 国产真实精品久久二三区| 看电影不卡的网站| 国产伦精品一区二区三区在线观看| 国产a区久久久| 色88888久久久久久影院野外| 色综合久久六月婷婷中文字幕| 欧美亚洲丝袜传媒另类| 欧美亚洲综合在线| 日韩欧美激情一区| 国产精品久久久久天堂| 亚洲毛片av在线| 精油按摩中文字幕久久| 91天堂素人约啪| 欧美tickling挠脚心丨vk| 国产精品久久久久精k8 | 欧美日韩一区不卡| 精品国产乱码久久久久久浪潮| 亚洲国产精品精华液ab| 亚洲va在线va天堂| 国产91精品免费| 欧美一区永久视频免费观看| 欧美成人性战久久| 亚洲人成亚洲人成在线观看图片| 免费高清在线视频一区·| 欧美日韩国产一级| 欧美自拍丝袜亚洲| 国产亚洲欧美色| 国产成人aaa| 欧美日韩一卡二卡| 夜夜爽夜夜爽精品视频| 国产乱码精品一区二区三区五月婷| 欧美色图激情小说| 日韩美女啊v在线免费观看| 蜜臀av性久久久久蜜臀aⅴ| 国产成人在线视频免费播放| 成人免费视频app| 国产视频亚洲色图| 国产一区二区三区在线观看免费视频 | 日韩三级在线观看| 日韩av电影免费观看高清完整版在线观看 | 五月天亚洲婷婷| 欧美日韩在线电影| 亚洲成人在线观看视频| 91福利资源站| ...av二区三区久久精品| 成人av免费观看| 精品国一区二区三区| 久久99国产精品尤物| 精品国产乱码久久久久久老虎| 国内精品不卡在线| 中文字幕二三区不卡| 成人精品国产一区二区4080| 国产精品欧美久久久久无广告| 成人黄动漫网站免费app| 综合久久久久久| 在线精品国精品国产尤物884a| 亚洲在线观看免费视频| 欧美美女黄视频| 国产美女av一区二区三区| 中文字幕在线免费不卡| 欧美精品国产精品| 成人av动漫网站| 亚洲欧美在线视频观看| 精品系列免费在线观看| 欧美精品一区二区蜜臀亚洲| 国产九色精品成人porny| 国产精品视频看| 欧美精品久久久久久久久老牛影院| 亚洲自拍偷拍网站| 精品奇米国产一区二区三区| 成人av网址在线| 一个色在线综合| 2020国产精品自拍| 欧美午夜理伦三级在线观看| 国产真实精品久久二三区| 亚洲日本在线看| 国产日产亚洲精品系列| 欧美午夜在线一二页| 成人av小说网| 久久精品国产在热久久| 亚洲精品大片www| 国产视频一区在线播放| 337p亚洲精品色噜噜狠狠| 91美女片黄在线| 国产在线麻豆精品观看| 五月天激情综合网| 亚洲综合在线视频| 自拍偷在线精品自拍偷无码专区| 日韩精品一区二| 91精品国产入口在线| 欧美精品乱码久久久久久| 欧美日韩国产中文| 欧美美女一区二区三区| 欧美日韩中文一区| 一本久久精品一区二区| 91极品视觉盛宴| 欧美久久久影院| 欧美一区二区三区小说| 欧美在线免费播放| 欧美午夜电影网| 欧美高清www午色夜在线视频| 欧美精品 日韩| 精品免费一区二区三区| 国产人伦精品一区二区| 国产精品久久三| 亚洲国产成人av网| 蜜桃视频一区二区| 国产成人在线视频播放| 欧美亚洲一区三区| 欧美色网一区二区| 国产无一区二区| 亚洲成av人片在www色猫咪| 青青国产91久久久久久| 成人网页在线观看| 欧美日韩一级片网站| 精品国产91乱码一区二区三区| 亚洲视频精选在线| 麻豆一区二区99久久久久| 97精品国产97久久久久久久久久久久| 欧美伊人久久大香线蕉综合69| 精品卡一卡二卡三卡四在线| 国产精品的网站| 亚洲精品福利视频网站| 精品一区二区av| 欧美视频一区在线| 国产精品国产三级国产aⅴ入口| 日韩成人伦理电影在线观看| 成人97人人超碰人人99| 欧美tickling网站挠脚心| 亚洲宅男天堂在线观看无病毒| 成人一区二区三区视频| 日韩一区二区麻豆国产| 婷婷成人综合网|