์ด ํ์ด์ง๋ 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ํ
๊ทธ ์ฐ๋ ๋ฒ์ด ๋ญ๋ผ๊ตฌ? ใ
ก.ใ
ก 
~cpp [[BR]]
์ด๊ฒ, ํ์ง๋ง ์ฐ์ง ์๊ณ ์ผ๋ง๋ ์ง ๋ฐฉ๋ฒ์ด 
๊ดํ์ฌ ¶
* ๋ฐฐํฌ ๊ณํ ์๋ฆฝ ํ์
- ์ฑ๊ณต์ ์ธ ์ ํ์ ์ ์ํ๊ธฐ ์ํด ์ถฉ๋ถํ ์คํ ๋ฆฌ๋ฅผ ์์ฑํ๋ค.
- ํ์ํ ์กฐ์ฌ๋ฅผ ์ํํ๋ค.
- ๊ฐ ์คํ ๋ฆฌ ๊ตฌํ์ ๋์ด๋๋ฅผ ์ถ์ ํ๋ค.
- ์คํ ๋ฆฌ ๊ตฌํ ์๋๋ฅผ ์ถ์ ํ๋ค.
- ๋น์ฆ๋์ค ๊ฐ์น์ ๋์ด๋์ ๊ธฐ๋ฐํ์ฌ ์ฒซ๋ฒ์งธ ๋ฐฐํฌ๋ฅผ ํ๊ธฐ ์ํ ์คํ ๋ฆฌ๋ฅผ ์ ํํ๋ค.
* ๋จ์ํ ์ค๊ณ
- ๋ชจ๋ ํ
์คํธ๋ฅผ ์คํํ๋ค.
- ๋ชจ๋ ์์ด๋์ด๋ฅผ ํํํ๋ค.
- ์ค๋ณต๋ ์ฝ๋๋ฅผ ํฌํจํ์ง ์๋๋ค.
- ์ต์ํ์ ํด๋์ค์ ๋ฉ์๋๋ฅผ ๊ฐ์ง๋ค.