#include "stdafx.h" #include "Image.h" #include "hDIB.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CCImage load/save bmp // Function : CImage::LoadBMP // Descript : BMP À̹ÌÁö¸¦ ÀоîµéÀδÙ. // Return : BOOL // Argument : LPCTSTR lpszFileName BOOL CImage::LoadBMP(LPCTSTR lpszFileName) { CFile file; CFileException fe; BITMAPFILEHEADER bfHeader; // Àб⠸ðµå·Î ÆÄÀÏ ¿­±â if (!file.Open(lpszFileName, CFile::modeRead|CFile::shareDenyWrite, &fe)) return FALSE; // ÆÄÀÏ Çì´õ Àбâ if (file.Read((LPSTR)&bfHeader, sizeof(bfHeader)) != sizeof(bfHeader)) return FALSE; // BMP ÆÄÀÏÀÓÀ» ³ªÅ¸³»´Â "BM" ¸¶Ä¿°¡ ÀÖ´ÂÁö È®ÀÎ if (bfHeader.bfType != DIB_HEADER_MARKER) return FALSE; // ÆÄÀÏÀÇ ±æÀ̸¦ ±¸ÇÔ DWORD dwBitsSize = file.GetLength() - sizeof(BITMAPFILEHEADER); // ¸Þ¸ð¸® ÇÒ´ç HGLOBAL hImage = ::GlobalAlloc(GHND, dwBitsSize); if (hImage == NULL) return FALSE; // ¸Þ¸ð¸® °íÁ¤ LPSTR pDIB = (LPSTR) ::GlobalLock(hImage); // ÆÄÀÏ Àбâ if (file.ReadHuge(pDIB, dwBitsSize) != dwBitsSize) { ::GlobalUnlock(hImage); ::GlobalFree(hImage); return FALSE; } // ¸Þ¸ð¸® Ç®¾îÁÜ ::GlobalUnlock(hImage); return ConvertToImage(hImage); } // Function : CImage::ConvertToImage // Descript : BMP À̹ÌÁö¸¦ CImage·Î º¯È¯ÇÑ´Ù. // Return : BOOL // Argument : HGLOBAL hDIB BOOL CImage::ConvertToImage(HGLOBAL hDIB) { if (hDIB == NULL) return FALSE; // ¸Þ¸ð¸® °íÁ¤ BYTE * srcAddress = (BYTE *) ::GlobalLock(hDIB); // ±×¸± À̹ÌÁö »ý¼º long dx = ::DibWidth(srcAddress); long dy = ::DibHeight(srcAddress); if (Create(dx, dy) == FALSE) return FALSE; // ±×¸± À̹ÌÁöÀÇ ¸Þ¸ð¸® °íÁ¤ BYTE * address = (BYTE *) ::GlobalLock(m_hImage); long columns = GetRealWidth(); RGBQUAD color; long indexY, index; for (long y = 0; y < dy; y++) { // Y Ãà»óÀÇ ½ÃÀÛ À§Ä¡ °è»ê indexY = y * columns; for (long x = 0; x < dx; x++) { // Ä¥ÇÑ À̹ÌÁöÀÇ À§Ä¡ °è»ê index = indexY + x * 3; // »ö»ó °¡Á®¿À±â ::DibGetPixelColor(srcAddress, x, y, &color); // »ö»ó ¾²±â address[index + 2] = color.rgbRed; address[index + 1] = color.rgbGreen; address[index ] = color.rgbBlue; } } // ¸Þ¸ð¸® Ç®¾îÁÜ ::GlobalUnlock(m_hImage); ::GlobalUnlock(hDIB); ::GlobalFree(hDIB); return TRUE; } // Function : CImage::ConvertToDIB // Descript : CImage Çü½ÄÀ» DIB·Î º¯È¯ÇÑ´Ù. 24-bit DIB // Return : HGLOBAL // Argument : void HGLOBAL CImage::ConvertToDIB() { if (m_hImage == NULL) return NULL; // »õ·Î¿î DIB·ê »ý¼ºÇÑ´Ù. »ý¼ºµÉ¶§ Á¤º¸µµ ¼¼Æà µÈ´Ù. HDIB hHandle = ::DibCreate(GetWidth(), GetHeight(), GetBitCount()); if (hHandle == NULL) return NULL; // ¸Þ¸ð¸® °íÁ¤ void * des = ::GlobalLock(hHandle); void * desAddress = ::DibImage(des); void * srcAddress = ::GlobalLock(m_hImage); // À̹ÌÁö¸¦ ±×´ë·Î º¹»çÇÏ¸é µÈ´Ù. memcpy(desAddress, srcAddress, GetHeight() * GetRealWidth()); ::GlobalUnlock(m_hImage); ::GlobalUnlock(hHandle); return hHandle; } // Function : CImage::SaveBMP // Descript : BMP Æ÷¸ËÀ¸·Î À̹ÌÁö¸¦ ÀúÀåÇÑ´Ù. // Return : BOOL // Argument : LPCTSTR lpszFileName BOOL CImage::SaveBMP(LPCTSTR lpszFileName) { CFile file; CFileException fe; BITMAPFILEHEADER bmFileHeader; // ¸Þ¸ð¸® ÇÚµéÀÌ À¯È¿ÇÑÁö È®ÀÎ if (m_hImage == NULL) return FALSE; // ¾²±â ¸ðµå·Î ÆÄÀÏ ¿­±â if (!file.Open(lpszFileName, CFile::modeCreate | CFile::modeWrite | CFile::shareDenyWrite, &fe)) return FALSE; // ¸Þ¸ð¸® °íÁ¤ LPSTR address = (LPSTR) ::GlobalLock(m_hImage); if (address == NULL) return FALSE; // ºñÆ®¸Ê ÆÄÀÏ Çì´õ Á¤º¸¸¦ ¼³Á¤ bmFileHeader.bfType = DIB_HEADER_MARKER; // "BM" DWORD dwDIBSize = m_biHeader.biSize; dwDIBSize += m_biHeader.biClrUsed * sizeof(RGBQUAD); dwDIBSize += m_biHeader.biSizeImage; bmFileHeader.bfSize = dwDIBSize + sizeof(BITMAPFILEHEADER); bmFileHeader.bfReserved1 = 0; bmFileHeader.bfReserved2 = 0; bmFileHeader.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + m_biHeader.biSize; TRY { // ºñÆ®¸Ê ÆÄÀÏ Çì´õ¸¦ ÆÄÀÏ¿¡ ¾²±â file.Write((LPSTR)&bmFileHeader, sizeof(BITMAPFILEHEADER)); // ºñÆ®¸Ê Á¤º¸ Çì´õ¸¦ ÆÄÀÏ¿¡ ¾²±â file.Write((LPSTR)&m_biHeader, sizeof(BITMAPINFOHEADER)); // ³ª¸ÓÁö µ¥ÀÌÅ͸¦ ÆÄÀÏ¿¡ ¾²±â file.WriteHuge(address, dwDIBSize); } CATCH (CFileException, e) { ::GlobalUnlock( m_hImage); THROW_LAST(); } END_CATCH // ¸Þ¸ð¸® Ç®¾îÁÜ ::GlobalUnlock( m_hImage); return TRUE; }