U E D R , A S I H C RSS

Project Semi Photoshop/Spike Solution

Ž˜ง€๋Š” 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]] ฒƒ, •˜ง€๋งŒ “ฐง€ •Š  –ผ๋งˆ๋“ ง€ ๋ฐฉ๋ฒ•;;


ด€•˜—ฌ

* ๋ฐฐฌ „š ˆ˜๋ฆฝ šŒ˜
  1. „ณต  œ’ˆ„  •˜•˜ธฐ œ„•ถฉ๋ถ„•œ Šค† ๋ฆฌ๋ฅผ ž‘„•œ‹ค.
  2. •„š”•œ กฐ‚ฌ๋ฅผ ˆ˜–‰•œ‹ค.
  3. ฐ Šค† ๋ฆฌ ตฌ˜„˜ ๋‚œด๋„๋ฅผ ถ” ••œ‹ค.
  4. Šค† ๋ฆฌ ตฌ˜„ †๋„๋ฅผ ถ” ••œ‹ค.
  5. ๋น„ฆˆ๋‹ˆŠค ฐ€˜™€ ๋‚œด๋„— ธฐ๋ฐ˜•˜—ฌ ฒซ๋ฒˆงธ ๋ฐฐฌ๋ฅผ •˜ธฐ œ„•œ Šค† ๋ฆฌ๋ฅผ „ ƒ•œ‹ค.

* ฝ”๋“œ˜ ณต๋™ †Œœ 

* ๋‹ˆœ•œ „„
  1. ๋ชจ๋“  …ŒŠคŠธ๋ฅผ ‹–‰•œ‹ค.
  2. ๋ชจ๋“  •„ด๋””–ด๋ฅผ ‘œ˜„•œ‹ค.
  3. ‘๋ณต๋œ ฝ”๋“œ๋ฅผ ฌ••˜ง€ •Š๋Š”๋‹ค.
  4. œ†Œ•œ˜ ด๋ž˜Šค™€ ๋ฉ”†Œ๋“œ๋ฅผ ฐ€„‹ค.

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:24:06
Processing time 0.0154 sec