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.0160 sec