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