์ด ํ์ด์ง๋ ProjectSemiPhotoshop์ Spike Solution ํ์ด์ง ์
๋๋ค.
ProjectSemiPhotoshop/์๊ตฌ์ฌํญ์ ์๋ ์คํ ๋ฆฌ์ ๋์ด๋๋ฅผ ์ถ์ ํ๊ณ ๋ฌธ์ ์์ญ ์ ๋ฐ์ ๋ค๋ฃจ๋ ํ์ด์ง์
๋๋ค.
๊ธฐ์กด ํ ์คํธ๋ง ํ๋ ๋ฐฉ์์ ๋ ๋.. ํํ ์๊ฐ๊ด๊ณ์ ์์ค ๊ตฌํ์ ์ฌํ์ฉ/์ฒด๊ณํํ๋ ๋ชฉ์ ์ผ๋ก ๋์์ต๋๋ค.
๊ธฐ์กด ํ ์คํธ๋ง ํ๋ ๋ฐฉ์์ ๋ ๋.. ํํ ์๊ฐ๊ด๊ณ์ ์์ค ๊ตฌํ์ ์ฌํ์ฉ/์ฒด๊ณํํ๋ ๋ชฉ์ ์ผ๋ก ๋์์ต๋๋ค.
Spike Solution ¶
์ด๋ฏธ์ง ํด๋์ค ์ ์ฒด ๋ชจ์ต ¶
~cpp
class CImage
{
protected:
HDIB m_hImage; //image handle
HDIB m_hUndoImage; //undo image handle
CSize m_Size; //image size
public:
BOOL InitDIB(BOOL bCreatePalette = TRUE);
void SetHandle(HANDLE hHandle);
BOOL CreateDIBPalette();
virtual ~CImage() { Free(); }
void Free();
int GetBitCount();
HDIB GetHandle() {return m_hImage;}
BOOL IsDataNull() {return (m_hImage == NULL);}
CSize GetSize() {return m_Size;}
int GetHeight() {return m_Size.cy;}
int GetWidth() {return m_Size.cx;}
int GetRealWidth() {return WIDTHBYTES((GetWidth()*GetBitCount()));}
HDIB GetUndoHandle() {return m_hUndoImage;}
CPalette *GetPalette() {return m_pPal;}
BOOL Draw(HDC hDC, LPRECT sourceRect, LPRECT destRect);
BOOL Save(LPCTSTR lpszFileName);
BOOL Load(LPCTSTR lpszFileName);
protected:
BOOL LoadBMP(LPCTSTR lpszFileName);
BOOL SaveBMP(LPCTSTR lpszFileName);
};
/******************************************************
DIB์ ๊ด๋ จ๋ ์ ์ญ ํจ์
******************************************************/
LPSTR WINAPI FindDIBBits(LPSTR lpbi)
{
return (lpbi + *(LPDWORD)lpbi + ::PaletteSize(lpbi));
}
DWORD WINAPI DIBWidth(LPSTR lpDIB)
{
LPBITMAPINFOHEADER lpbmi; // pointer to a Win 3.0-style DIB
LPBITMAPCOREHEADER lpbmc; // pointer to an other-style DIB
/* point to the header (whether Win 3.0 and old) */
lpbmi = (LPBITMAPINFOHEADER)lpDIB;
lpbmc = (LPBITMAPCOREHEADER)lpDIB;
/* return the DIB width if it is a Win 3.0 DIB */
if (IS_WIN30_DIB(lpDIB))
return lpbmi->biWidth;
else /* it is an other-style DIB, so return its width */
return (DWORD)lpbmc->bcWidth;
}
DWORD WINAPI DIBHeight(LPSTR lpDIB)
{
LPBITMAPINFOHEADER lpbmi; // pointer to a Win 3.0-style DIB
LPBITMAPCOREHEADER lpbmc; // pointer to an other-style DIB
/* point to the header (whether old or Win 3.0 */
lpbmi = (LPBITMAPINFOHEADER)lpDIB;
lpbmc = (LPBITMAPCOREHEADER)lpDIB;
/* return the DIB height if it is a Win 3.0 DIB */
if (IS_WIN30_DIB(lpDIB))
return lpbmi->biHeight;
else /* it is an other-style DIB, so return its height */
return (DWORD)lpbmc->bcHeight;
}
WORD WINAPI PaletteSize(LPSTR lpbi)
{
/* calculate the size required by the palette */
if (IS_WIN30_DIB (lpbi))
return (WORD)(::DIBNumColors(lpbi) * sizeof(RGBQUAD));
else
return (WORD)(::DIBNumColors(lpbi) * sizeof(RGBTRIPLE));
}
WORD WINAPI DIBNumColors(LPSTR lpbi)
{
WORD wBitCount; // DIB bit count
/* If this is a Windows-style DIB, the number of colors in the
* color table can be less than the number of bits per pixel
* allows for (i.e. lpbi->biClrUsed can be set to some value).
* If this is the case, return the appropriate value.
*/
if (IS_WIN30_DIB(lpbi))
{
DWORD dwClrUsed;
dwClrUsed = ((LPBITMAPINFOHEADER)lpbi)->biClrUsed;
if (dwClrUsed != 0)
return (WORD)dwClrUsed;
}
/* Calculate the number of colors in the color table based on
* the number of bits per pixel for the DIB.
*/
if (IS_WIN30_DIB(lpbi))
wBitCount = ((LPBITMAPINFOHEADER)lpbi)->biBitCount;
else
wBitCount = ((LPBITMAPCOREHEADER)lpbi)->bcBitCount;
/* return number of colors based on bits per pixel */
switch (wBitCount)
{
case 1:
return 2;
case 4:
return 16;
case 8:
return 256;
default:
return 0;
}
}
/******************************************************
ํด๋ฆฝ๋ณด๋๋ฅผ ์ํ ์ ์ญ ํจ์
******************************************************/
HGLOBAL WINAPI CopyHandle (HGLOBAL h)
{
if (h == NULL)
return NULL;
DWORD dwLen = ::GlobalSize((HGLOBAL) h);
HGLOBAL hCopy = ::GlobalAlloc(GHND, dwLen);
if (hCopy != NULL)
{
void* lpCopy = ::GlobalLock((HGLOBAL) hCopy);
void* lp = ::GlobalLock((HGLOBAL) h);
memcpy(lpCopy, lp, dwLen);
::GlobalUnlock(hCopy);
::GlobalUnlock(h);
}
return hCopy;
}
์ด๋ฏธ์ง ํ์ผ ์ฝ๊ณ ์ฐ๊ธฐ ¶
~cpp
BOOL CImage::Load(LPCTSTR lpszFileName)
{
CString filetype;
filetype = lpszFileName;
filetype.MakeUpper();
if(filetype.Find(".BMP") > -1) return LoadBMP(lpszFileName);
else if(filetype.Find(".TIF") > -1) return LoadTIF(lpszFileName);
else if(filetype.Find(".GIF") > -1) return LoadGIF(lpszFileName);
else if(filetype.Find(".JPG") > -1) return LoadJPG(lpszFileName);
else return FALSE;
}
~cpp
BOOL CImage::LoadBMP(LPCTSTR lpszFileName)
{
CFile file;
CFileException fe;
LPSTR pDIB;
DWORD dwBitsSize;
BITMAPFILEHEADER bmfHeader;
// ์ฝ๊ธฐ ๋ชจ๋๋ก ํ์ผ ์ด๊ธฐ
if(!file.Open(lpszFileName, CFile::modeRead|CFile::shareDenyWrite, &fe))
return FALSE;
// ํ์ผ์ ๊ธธ์ด๋ฅผ ๊ตฌํจ
dwBitsSize = file.GetLength();
// ํ์ผ ํค๋ ์ฝ๊ธฐ
if(file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader))!=sizeof(bmfHeader))
return FALSE;
// BMP ํ์ผ์์ ๋ํ๋ด๋ "BM" ๋ง์ปค๊ฐ ์๋์ง ํ์ธ
if (bmfHeader.bfType != DIB_HEADER_MARKER)
return FALSE;
// ๋ฉ๋ชจ๋ฆฌ ํ ๋น
if((m_hImage = (HDIB)::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwBitsSize)) == NULL) return FALSE;
// ๋ฉ๋ชจ๋ฆฌ ๊ณ ์
pDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_hImage);
// ํ์ผ ์ฝ๊ธฐ
if (file.ReadHuge(pDIB, dwBitsSize - sizeof(BITMAPFILEHEADER)) != dwBitsSize - sizeof(BITMAPFILEHEADER) )
{
::GlobalUnlock((HGLOBAL) m_hImage);
::GlobalFree((HGLOBAL) m_hImage);
return FALSE;
}
// ๋ฉ๋ชจ๋ฆฌ ํ์ด์ค
::GlobalUnlock((HGLOBAL) m_hImage);
// DIB ์ด๊ธฐํ
InitDIB();
return TRUE;
}
~cpp
BOOL CImage::Save(LPCTSTR lpszFileName)
{
CString filetype;
filetype = lpszFileName;
filetype.MakeUpper();
if(filetype.Find(".BMP") > -1) return SaveBMP(lpszFileName);
else if(filetype.Find(".TIF") > -1) return SaveTIF(lpszFileName);
else if(filetype.Find(".GIF") > -1) return SaveGIF(lpszFileName);
else if(filetype.Find(".JPG") > -1) return SaveJPG(lpszFileName);
else return FALSE;
}
~cpp
BOOL CImage::SaveBMP(LPCTSTR lpszFileName)
{
CFile file;
CFileException fe;
BITMAPFILEHEADER bmfHdr;
LPBITMAPINFOHEADER lpBI;
DWORD dwDIBSize;
// ์ฐ๊ธฐ ๋ชจ๋๋ก ํ์ผ ์ด๊ธฐ
if (!file.Open(lpszFileName, CFile::modeCreate | CFile::modeWrite | CFile::shareDenyWrite, &fe)) return FALSE;
// ๋ฉ๋ชจ๋ฆฌ ํธ๋ค์ด ์ ํจํ์ง ํ์ธ
if (m_hImage == NULL) return FALSE;
// ๋ฉ๋ชจ๋ฆฌ ๊ณ ์
lpBI = (LPBITMAPINFOHEADER)::GlobalLock((HGLOBAL)m_hImage);
if (lpBI == NULL) return FALSE;
// ๋นํธ๋งต ํ์ผ ํค๋ ์ ๋ณด๋ฅผ ์ค์
bmfHdr.bfType = DIB_HEADER_MARKER; // "BM"
dwDIBSize = *(LPDWORD)lpBI + ::PaletteSize((LPSTR)lpBI);
if((lpBI->biCompression==BI_RLE8) || (lpBI->biCompression==BI_RLE4))
dwDIBSize += lpBI->biSizeImage;
else
{
DWORD dwBmBitsSize; // Size of Bitmap Bits only
dwBmBitsSize = WIDTHBYTES((lpBI->biWidth)*((DWORD)lpBI->biBitCount)) * lpBI->biHeight;
dwDIBSize += dwBmBitsSize;
lpBI->biSizeImage = dwBmBitsSize;
}
bmfHdr.bfSize = dwDIBSize + sizeof(BITMAPFILEHEADER);
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+lpBI->biSize + PaletteSize((LPSTR)lpBI);
TRY
{
// ๋นํธ๋งต ํ์ผ ํค๋๋ฅผ ํ์ผ์ ์ฐ๊ธฐ
file.Write((LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER));
// ๋๋จธ์ง ๋ฐ์ดํฐ๋ฅผ ํ์ผ์ ์ฐ๊ธฐ
file.WriteHuge(lpBI, dwDIBSize);
}
CATCH (CFileException, e)
{
::GlobalUnlock((HGLOBAL) m_hImage);
THROW_LAST();
}
END_CATCH
// ๋ฉ๋ชจ๋ฆฌ ํ์ด์ค
::GlobalUnlock((HGLOBAL) m_hImage);
return TRUE;
}
๋ชจ์์ดํฌ ์ฒ๋ฆฌ ๋ถ๋ถ ¶
~cpp
HDIB CMyImage::MosaicProcess()
{
LPSTR pDIB;
LPSTR pPixels;
int i,j;
long lw; // ์ค์ ์ฐ์ฌ์ง Width๊ฐ์
๋๋ค.
int avrcolor; // ๋ณํ ํ์ Color๊ฐ์
๋๋ค.
// ๋ฉ๋ชจ๋ฆฌ ๊ณ ์
pDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_hImage);
//์ด๋ฏธ์ง๋ฐ์ดํ ์ฒ์ ์์น๋ฅผ ๊ตฌํฉ๋๋ค.
pPixels = DataBits(pDIB);
// ์ด๋ฏธ์ง ๊ฐ๋ก๋ 4์ ๋ฐฐ์๋ก ์ ์ฅ๋จ์ผ๋ก ๊ฐ์ ๋ ๋ํฉ๋๋ค.
lw = m_Size.cx + (m_Size.cx%4>0?(4-m_Size.cx%4):0);
// ๋ค์นธ์ ํฝ์
๊ฐ์ ๋์ผํ ๊ฐ์ผ๋ก ํ๊ท ํ ํฉ๋๋ค.
for (i=0;i<m_Size.cy;i+=2)
{
for (j=0;j<m_Size.cx;j+=2)
{
avrcolor = 0;
avrcolor += (int)((BYTE *)pPixels)[i*lw+j];
avrcolor += (int)((BYTE *)pPixels)[i*lw+(j+1)];
avrcolor += (int)((BYTE *)pPixels)[(i+1)*lw+j];
avrcolor += (int)((BYTE *)pPixels)[(i+1)*lw+(j+1)];
avrcolor/=4;
((BYTE *)pPixels)[i*lw+j] = (char)avrcolor;
((BYTE *)pPixels)[i*lw+(j+1)] = (char)avrcolor;
((BYTE *)pPixels)[(i+1)*lw+j] = (char)avrcolor;
((BYTE *)pPixels)[(i+1)*lw+(j+1)] = (char)avrcolor;
}
}
// ๋ฉ๋ชจ๋ฆฌ ๋์์ค
::GlobalUnlock((HGLOBAL) m_hImage);
return (HDIB)pDIB;
}
์ด๋ฏธ์ง ํ์ผ ์ฝ๊ณ ์ฐ๊ธฐ ¶
์ด๋ฏธ์ง ํ์ผ ์ฝ๊ณ ์ฐ๊ธฐ ¶
์ด๋ฏธ์ง ํ์ผ ์ฝ๊ณ ์ฐ๊ธฐ ¶
์ด๋ฏธ์ง ํ์ผ ์ฝ๊ณ ์ฐ๊ธฐ ¶
์ด๋ฏธ์ง ํ์ผ ์ฝ๊ณ ์ฐ๊ธฐ ¶
์ถ์ ์์ฝ ¶
=== ===
Thread ¶
๋ด ์๊ฐ์ SpikeSolution ๊ณผ์ ์์ ์ค๋ณต๋ ์ฝ๋๊ฐ ๋์ฌ๊ฒ ๊ฐ๊ณ ๋์ค์ ์ด๊ฒ๋ค์ ๋ฌถ์ด์ ๋จ์ํ ์ค๊ณ๋ฅผ ๊ตฌํ์ํฌ ์ ์์ ๊ฒ ๊ฐ๋ค.

์ค ์ ๊ธฐํ๋ค. ์ด๊ฑธ๋ก ์๋ฃจ์
์ด ์ธ๊ฐ์ฏค์ธ๊ฑฐ๋ค, ์ฐ๋ฆฌ์กฐ๋ ์ ํ๋ ํ ์ ์๋ค ๋๋จํ์กฐ
--neocoin
์ง๊ธ ์ํค ์ฐธ ๋ง์ ์๋๋ค.. BRํ
๊ทธ ์ฐ๋ ๋ฒ์ด ๋ญ๋ผ๊ตฌ? ใ
ก.ใ
ก
--neocoin~cpp [[BR]] ์ด๊ฒ, ํ์ง๋ง ์ฐ์ง ์๊ณ ์ผ๋ง๋ ์ง ๋ฐฉ๋ฒ์ด 
๊ดํ์ฌ ¶
* ๋ฐฐํฌ ๊ณํ ์๋ฆฝ ํ์
- ์ฑ๊ณต์ ์ธ ์ ํ์ ์ ์ํ๊ธฐ ์ํด ์ถฉ๋ถํ ์คํ ๋ฆฌ๋ฅผ ์์ฑํ๋ค.
- ํ์ํ ์กฐ์ฌ๋ฅผ ์ํํ๋ค.
- ๊ฐ ์คํ ๋ฆฌ ๊ตฌํ์ ๋์ด๋๋ฅผ ์ถ์ ํ๋ค.
- ์คํ ๋ฆฌ ๊ตฌํ ์๋๋ฅผ ์ถ์ ํ๋ค.
- ๋น์ฆ๋์ค ๊ฐ์น์ ๋์ด๋์ ๊ธฐ๋ฐํ์ฌ ์ฒซ๋ฒ์งธ ๋ฐฐํฌ๋ฅผ ํ๊ธฐ ์ํ ์คํ ๋ฆฌ๋ฅผ ์ ํํ๋ค.
* ๋จ์ํ ์ค๊ณ
- ๋ชจ๋ ํ
์คํธ๋ฅผ ์คํํ๋ค.
- ๋ชจ๋ ์์ด๋์ด๋ฅผ ํํํ๋ค.
- ์ค๋ณต๋ ์ฝ๋๋ฅผ ํฌํจํ์ง ์๋๋ค.
- ์ต์ํ์ ํด๋์ค์ ๋ฉ์๋๋ฅผ ๊ฐ์ง๋ค.










