GDI+ÀÇ Å« ÀåÁ¡ ÁßÀÇ Çϳª°¡ ¿©·¯ °¡Áö Æ÷¸ËÀÇ ±×¸² ÆÄÀÏÀ» ´Ù·ê ¼ö ÀÖ´Ù´Â Á¡ÀÌ´Ù. ÀÌÀüÀÇ GDI´Â ¿À·ÎÁö À©µµ¿ìÁîÀÇ ±âº» À̹ÌÁö Æ÷¸ËÀÎ BMP ÆÄÀϸ¸ ´Ù·ê ¼ö ÀÖ¾î ¹«Ã´ ºÒÆíÇß´Ù. BMP´Â ¾ÐÃà·üÀÌ ÁÁÁö ¾ÊÀ¸¸ç À̹ÌÁö ¿ë·®ÀÌ ³Ê¹« Ä¿¼ ºÎ´ã¾øÀÌ »ç¿ëÇϱ⠾î·Æ´Ù. À¥, µðÁöÅÐ Ä«¸Þ¶óÀÇ Ç¥ÁØ Æ÷¸ËÀÎ JPGÀ» Ãâ·ÂÇØ¾ß ÇÒ °æ¿ì LeadTools°°Àº º°µµÀÇ »ó¿ë ¶óÀ̺귯¸®¸¦ »ç¿ëÇؾ߸¸ Çß´Ù.
ÇÏÁö¸¸ ÀÌ·± ºÒÆíÇÔÀÌ µåµð¾î GDI+¿¡ ÀÇÇØ ¸»²ûÈ÷ ÇØ°áµÇ¾ú´Âµ¥ JPG, GIF»Ó¸¸ ¾Æ´Ï¶ó TIFF, PNG µîÀÇ ÀÚÁÖ »ç¿ëµÇ´Â ±×·¡ÇÈ Æ÷¸ËÀ» ¸ðµÎ Áö¿øÇϹǷΠº°µµÀÇ ¿ÜºÎ ¶óÀ̺귯¸®¾øÀ̵µ ¼öÁسôÀº ±×·¡ÇÈ Ã³¸®°¡ °¡´ÉÇØÁ³´Ù. JPG Ãâ·ÂÀÌ °¡´ÉÇÏ´Ù´Â °ÍÀº GDI+ÀÇ °¡Àå ¸Å·ÂÀûÀÎ ±â´ÉÀÌ¸ç ¶ÇÇÑ GDI+¸¦ »ç¿ëÇØ¾ß ÇÏ´Â °¡Àå Çö½ÇÀûÀÎ ÀÌÀ¯À̱⵵ ÇÏ´Ù.
GDI+ÀÇ ±âº» À̹ÌÁö Ŭ·¡½º´Â ImageÀ̸ç ÀÌ Å¬·¡½º¿¡ À̹ÌÁö¿Í °ü·ÃµÈ ´ëºÎºÐÀÇ ±â´ÉµéÀÌ Ä¸½¶ÈµÇ¾î ÀÖ´Ù. Image·ÎºÎÅÍ Á» ´õ Àü¹®ÀûÀÌ°íµµ ¼¶¼¼ÇÑ Ã³¸®°¡ °¡´ÉÇÑ Bitmap, MetaFile µîÀÇ Æ¯¼öÇÑ Å¬·¡½ºµéÀÌ ÆÄ»ýµÈ´Ù. Image Ŭ·¡½ºÀÇ »ý¼ºÀÚ´Â ´ÙÀ½ µÎ °¡Áö°¡ ÁغñµÇ¾î ÀÖ´Ù.
Image(const WCHAR *filename, BOOL useEmbeddedColorManagement);
Image(IStream *stream, BOOL useEmbeddedColorManagement);
ÇÏµå µð½ºÅ©»óÀÇ ÆÄÀϷκÎÅÍ ¶Ç´Â ¸Þ¸ð¸®ÀÇ ½ºÆ®¸²À¸·ÎºÎÅÍ À̹ÌÁö¸¦ ÀÐÀ» ¼ö ÀÖ´Ù. ù ¹ø° Àμö·Î À̹ÌÁö ÆÄÀÏÀÇ Àý´ë °æ·Î ¶Ç´Â »ó´ë °æ·Î¸¦ Àü´ÞÇÑ´Ù. GDI+¿¡¼ »ç¿ëÇÏ´Â ¹®ÀÚ¿Àº ¸ðµÎ À¯´ÏÄÚµåÀ̹ǷΠ¹Ýµå½Ã À¯´ÏÄÚµå ¹®ÀÚ¿À» ÁÖ¾î¾ß ÇÑ´Ù. µÎ ¹ø° Àμö´Â À̹ÌÁö ÆÄÀÏ¿¡ Æ÷ÇԵǾî ÀÖ´Â »ö»ó °ü¸® Á¤º¸¸¦ »ç¿ëÇÏ¿© »ö»ó º¸Á¤À» ÇÒ °ÍÀÎÁö ¾Æ´ÑÁö¸¦ ÁöÁ¤Çϴµ¥ »ý·«ÇÒ °æ¿ì FALSE°¡ Àû¿ëµÈ´Ù. ´ÙÀ½ ÄÚµå´Â JPG ÆÄÀÏÀ» Àоî ȸéÀ¸·Î Ãâ·ÂÇÑ´Ù.
¿¹ Á¦ : DrawImage |
Image I(L"³ëÀ».jpg");
G.DrawImage(&I,0,0);
ÇöÀç µð·ºÅ丮¿¡¼ "³ëÀ».jpg" ÆÄÀÏÀ» Àоî¿Í ÀÛ¾÷ ¿µ¿ªÀÇ (0,0)¿¡ À̹ÌÁö Å©±â´ë·Î Ãâ·ÂÇÑ´Ù. JPG ÆÄÀÏÀÇ ³»ºÎ´Â ±²ÀåÈ÷ º¹ÀâÇÏÁö¸¸ ¾ÆÁÖ °£´ÜÇÏ°Ô ÆÄÀÏÀ» ÀÐ¾î¼ Ãâ·ÂÇÒ ¼ö ÀÖ´Ù. »ý¼ºÀÚ°¡ ÆÄÀÏÀ» ÀÐ¾î ¾ÐÃàÀ» ÇØÁ¦ÇÏ°í Ãâ·Â¿¡ ÇÊ¿äÇÑ ¸ðµç ¿¹ºñ µ¿ÀÛÀ» ´Ù ÇØ ³õÀ» °ÍÀÌ´Ù. ¶ÇÇÑ I°¡ Áö¿ª º¯¼ö·Î ¼±¾ðµÇ¾î ÀÖÀ¸¹Ç·Î µû·Î ÇØÁ¦ÇÒ ÇÊ¿äµµ ¾ø´Ù. I º¯¼ö°¡ ¹üÀ§¸¦ ¹þ¾î³¯ ¶§ Æı«ÀÚ°¡ ÀÚµ¿À¸·Î È£ÃâµÇ¾î ÇÊ¿äÇÑ Á¤¸® ÀÛ¾÷À» ¼öÇàÇϱ⠶§¹®ÀÌ´Ù.
´Ü µÎ ÁÙÀÇ ÄÚµå "Àоî", "±×·Á" ¸¸À¸·Î °íµµÀÇ ±â¼ú·Î ¾ÐÃàµÇ¾î ÀÖ´Â ±×·¡ÇÈ ÆÄÀÏÀÌ Ãâ·ÂµÈ´Ù. ÀÌ·¸°Ô °£´ÜÇÑ ¹æ¹ýÀ¸·Î JPG ÆÄÀÏÀ» Ãâ·ÂÇÒ ¼ö ÀÖµµ·Ï ÇÏ´Â °ÍÀÌ °´Ã¼ ÁöÇâÀÇ ÈûÀ̶ó°í ÇÒ ¼ö ÀÖ´Ù. ´Ü À̹ÌÁö ÆÄÀÏÀ» Àд Áß¿¡ ½ÇÆÐÇÒ °¡´É¼ºÀÌ ³ôÀ¸¹Ç·Î ¿¡·¯ 󸮴 ¹Ýµå½Ã ÇØ¾ß ÇÑ´Ù. »ý¼ºÀÚ´Â º°µµÀÇ ¸®ÅÏ°ªÀ» ¹ÝȯÇÒ ¼ö ¾øÀ¸¹Ç·Î GetLastStatus ÇÔ¼ö·Î ÃÖÁ¾ ÀÛ¾÷À» °á°ú¸¦ Á¡°ËÇØ º¸°í ÀÌ °ªÀÌ Ok°¡ ¾Æ´Ï¸é À̹ÌÁö ÆÄÀÏ Àб⿡ ½ÇÆÐÇÑ °ÍÀÌ´Ù.
Image I(L"³ëÀ».jpg");
if (I.GetLastStatus() != Ok) {
MessageBox(hWndMain,TEXT("À̹ÌÁö ÆÄÀÏÀ» ÀÐÀ» ¼ö ¾ø½À´Ï´Ù."),
TEXT("¿¡·¯"),MB_OK);
return;
}
G.DrawImage(&I,0,0);
À§ Äڵ忡¼´Â OnPaint¿¡¼ À̹ÌÁö °´Ã¼¸¦ »ý¼ºÇÏ°í Àִµ¥ ÀÌ´Â ¾îµð±îÁö³ª ¿¹Á¦À̱⠶§¹®¿¡ Äڵ带 °£´ÜÇÏ°Ô ÀÛ¼ºÇϱâ À§ÇØ ±×·¸°Ô ÇÑ °ÍÀÌÁö ½ÇÁ¦ Äڵ忡¼´Â À̹ÌÁö¸¦ ¹Ì¸® ÀÐ¾î ³õ¾Æ¾ß ±×¸®±â ¼Óµµ°¡ »¡¶óÁø´Ù. WM_PAINT ¸Þ½ÃÁö¿¡¼ LoadBitmapÀ» È£ÃâÇÏÁö ¸»¾Æ¾ß ÇÏ´Â ÀÌÀ¯¿Í ¶È°°´Ù.
Image Ŭ·¡½º¿¡´Â À̹ÌÁö¸¦ °ü¸®ÇÏ´Â ¸¹Àº ¸â¹ö ÇÔ¼öµéÀÌ Æ÷ÇԵǾî ÀÖ´Ù. ÁÖ¿ä ¸â¹ö ÇÔ¼öµé Áß ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖ´Â °Íµé¿¡ ´ëÇؼ¸¸ µµÇ¥·Î °£´ÜÇÏ°Ô Á¤¸®ÇØ º¸°í ³ª¸ÓÁö´Â Çϳª¾¿ ½Ç½ÀÇØ º¸µµ·Ï ÇÏÀÚ.
¸â¹ö ÇÔ¼ö |
¼³¸í |
FromFile |
µð½ºÅ©ÀÇ ÆÄÀϷκÎÅÍ À̹ÌÁö ÆÄÀÏÀ» ÀоîµéÀδÙ. |
FromStream |
½ºÆ®¸²À¸·ÎºÎÅÍ À̹ÌÁö¸¦ ÀоîµéÀδÙ. |
GetWidth |
À̹ÌÁöÀÇ ÆøÀ» ±¸ÇÑ´Ù. |
GetHeight |
À̹ÌÁöÀÇ ³ôÀ̸¦ ±¸ÇÑ´Ù. |
GetType |
À̹ÌÁöÀÇ Å¸ÀÔ(¸ÞŸ, ºñÆ®¸Ê)À» ±¸ÇÑ´Ù. |
RotateFlip |
À̹ÌÁö¸¦ ȸÀü ¶Ç´Â ¹ÝÀü½ÃŲ´Ù. |
GetRawFormat |
À̹ÌÁöÀÇ Æ÷¸ËÀ» ±¸ÇÑ´Ù. |
Save |
À̹ÌÁö¸¦ µð½ºÅ©ÀÇ ÆÄÀÏ·Î ÀúÀåÇÑ´Ù. |
FromFile Á¤Àû ÇÔ¼ö¸¦ »ç¿ëÇÏ¸é ½ÇÇàÁß¿¡ ¾ðÁ¦µçÁö À̹ÌÁö ÆÄÀÏÀ» »õ·Î ÀÐÀ» ¼ö ÀÖ´Ù. ImageÀÇ Æ÷ÀÎÅ͸¸ ¼±¾ðÇÑ ÈÄ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇϸé ÇÑ Æ÷ÀÎÅÍ º¯¼ö·Î À̹ÌÁö¸¦ ¹Ù²ã °¡¸é¼ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½ ÄÚµå´Â ¾ÕÀÇ ÄÚµå¿Í µ¿ÀÏÇÏ°Ô µ¿ÀÛÇÑ´Ù. FromFile ÇÔ¼ö´Â Image °´Ã¼¸¦ »õ·Î »ý¼ºÇÑ ÈÄ ±× Æ÷ÀÎÅ͸¦ ¸®ÅÏÇϹǷΠ´Ù »ç¿ëÇÑ ÈÄ delete´Â Á÷Á¢ ÇØ¾ß ÇÑ´Ù.
Image *pI;
pI=Image::FromFile(L"³ëÀ».jpg");
G.DrawImage(pI,0,0);
delete pI;
µð½ºÅ©»óÀÇ ÆÄÀÏ¿¡¼ À̹ÌÁö¸¦ Àд °ÍÀº Äڵ尡 °£´ÜÇؼ ÁÁ±â´Â ÇÏÁö¸¸ ¿©·¯ °¡Áö ¹®Á¦°¡ ÀÖ´Ù. À̹ÌÁö ÆÄÀÏÀ» ½ÇÇà ÆÄÀÏ°ú °°ÀÌ ¹èÆ÷ÇØ¾ß ÇÏ´Â ¹ø°Å·Î¿òÀÌ ÀÖ°í ÆÄÀÏÀÌ ´©¶ôµÇ°Å³ª ¼Õ»óµÇ¸é ÇÁ·Î±×·¥ÀÇ ¾ÈÀü¼º¿¡µµ ÁÁÁö ¾ÊÀº ¿µÇâÀ» ¹ÌÄ£´Ù. ¶Ç ½ÇÇàÁß¿¡ µð½ºÅ©¸¦ Àоî¾ß ÇϹǷΠ¼Óµµ»óÀ¸·Îµµ ºÒ¸®ÇÏ´Ù. ÇÁ·Î±×·¥ ½ÇÇà¿¡ ²À ÇÊ¿äÇÑ À̹ÌÁö´Â ¾Æ¿¹ ¸®¼Ò½º·Î ½ÇÇà ÆÄÀÏ¿¡ ¹Ú¾Æ ¹ö¸®´Â °ÍÀÌ ¾ÈÀüÇÏ´Ù. ½Ç½ÀÀ» À§ÇØ ¸®¼Ò½º ½ºÅ©¸³Æ®¸¦ ¸¸µé°í Pride640.jpg ÆÄÀÏÀ» Ä¿½ºÅÒ ¸®¼Ò½º·Î ÀÓÆ÷Æ®ÇØ º¸ÀÚ.
¸®¼Ò½º ŸÀÔ À̸§Àº JPG·Î ÁÖ°í ID´Â µðÆúÆ®·Î ÁÖ¾îÁö´Â IDR_JPG1À» ¹Þ¾ÆµéÀδÙ. »ç¿ëÀÚ Á¤ÀÇ ¸®¼Ò½º¸¦ ÀÐ¾î ½ºÆ®¸² °´Ã¼¸¦ ¸¸µé°í ÀÌ °´Ã¼¸¦ ImageÀÇ »ý¼ºÀÚ·Î Àü´ÞÇÑ´Ù. ÄÚµå´Â ´Ù¼Ò ±æ°í º¹ÀâÇÏ´Ù.
#include "resource.h"
void OnPaint(HDC hdc)
{
Graphics G(hdc);
HRSRC hResource = FindResource(g_hInst, MAKEINTRESOURCE(IDR_JPG1),
TEXT("JPG"));
if (!hResource) return;
DWORD imageSize = SizeofResource(g_hInst, hResource);
HGLOBAL hGlobal = LoadResource(g_hInst, hResource);
LPVOID pData = LockResource(hGlobal);
HGLOBAL hBuffer = GlobalAlloc(GMEM_MOVEABLE,imageSize);
LPVOID pBuffer = GlobalLock(hBuffer);
CopyMemory(pBuffer,pData,imageSize);
GlobalUnlock(hBuffer);
IStream *pStream;
HRESULT hr=CreateStreamOnHGlobal(hBuffer,TRUE,&pStream);
Image I(pStream);
pStream->Release();
if (I.GetLastStatus() != Ok) return;
G.DrawImage(&I,0,0);
}
Ä¿½ºÅÒ ¸®¼Ò½º¸¦ Àд ÄÚµå´Â ÀϹÝÀûÀÎ Win32 ÄÚµåÀÌ´Ù. Àü¿ª ¸Þ¸ð¸® ÇÚµé·ÎºÎÅÍ ½ºÆ®¸² °´Ã¼¸¦ ¸¸µé±â À§Çؼ´Â À̵¿ °¡´ÉÇÏ°í ºñ¿öÁöÁö ¾Ê´Â ¼Ó¼ºÀ» °¡Á®¾ß Çϴµ¥ »ç¿ëÀÚ Á¤ÀÇ ¸®¼Ò½º´Â ÀÌ ¿ä°ÇÀ» ¸¸Á·ÇÏÁö ¸øÇϹǷΠ»çº»À» µû·Î ¸¸µé¾ú´Ù. ÀÌ ÇÚµéÀ» CreateStreamOnHGlobal ÇÔ¼ö·Î Àü´ÞÇÏ¸é ½ºÆ®¸² °´Ã¼°¡ »ý¼ºµÇ¸ç »ý¼ºµÈ ½ºÆ®¸²À» ImageÀÇ »ý¼ºÀÚ·Î Àü´ÞÇÏ¸é µÈ´Ù. À̹ÌÁö °´Ã¼¸¦ ¸¸µç ÈÄ¿¡´Â ½ºÆ®¸²À» Æı«Çϸç À̶§ Àü¿ª Çڵ鵵 °°ÀÌ ÇÒ´ç ÇØÁ¦µÈ´Ù. ½ÇÇàÇØ º¸¸é ¿¹»Û Â÷ »çÁøÀÌ Ãâ·ÂµÈ´Ù.
ÀÌ »çÁøÀº ½ÇÇà ÆÄÀÏ¿¡ °°ÀÌ Æ÷ÇԵǾî ÀÖ´Â °ÍÀ̹ǷΠ¹èÆ÷»óÀÇ ¹®Á¦°¡ ¾øÀ¸¸ç Àд ¼Óµµµµ ºü¸£´Ù. º°µµÀÇ »çÁø ÆÄÀÏÀ» ¹èÆ÷ÇÒ ÇÊ¿ä¾øÀÌ ½ÇÇà ÆÄÀϸ¸À¸·Îµµ ´Üµ¶ ½ÇÇàµÈ´Ù. Âü°í·Î À§ ÄÚµå´Â °ø½Ä ¹®¼»ó¿¡¼ ¿¹Á¦¸¦ ãÁö ¸øÇØ ¾Æ´Â ¹üÀ§³»¿¡¼ ´ëÃæ ÀÛ¼ºÇØ º» °ÍÀ̶ó ½Å·Ú¼ºÀÌ ¶³¾îÁø´Ù. ¶Ç ¿¡·¯ 󸮵µ °ÅÀÇ ÇÏÁö ¾Ê°í ÀÖÀ¸¹Ç·Î ½Ç¹«¿¡¼ »ç¿ëÇÒ ¶§´Â Àû´çÈ÷ ¼ÕÀ» Á» º» ÈÄ »ç¿ëÇϱ⠹ٶõ´Ù.
´Ù¸¥ ÀÛµµ ÇÔ¼öµé°ú ¸¶Âù°¡Áö·Î À̹ÌÁö¸¦ Ãâ·ÂÇÏ´Â ÇÔ¼öµµ Graphics Ŭ·¡½ºÀÇ ¸â¹ö ÇÔ¼ö·Î Æ÷ÇԵǾî Àִµ¥ À̸§Àº ¸ðµÎ DrawImageÀÌÁö¸¸ Çü½ÄÀÌ ´Ù¸¥ 16°³ÀÇ ÇÔ¼ö°¡ ¿À¹ö·ÎµùµÇ¾î ÀÖ´Ù. ÀÌ Áß ½Ç¼ö ¹öÀüÀ» »©¸é Á¤¼ö ¹öÀü¸¸ 8°³°¡ ÀÖ´Â ¼ÀÀÌ´Ù. ¸ðµç ÇÔ¼öÀÇ Ã¹ ¹ø° Àμö´Â Ç×»ó Ãâ·Â ´ë»ó À̹ÌÁöÀÇ Æ÷ÀÎÅÍÀÌ´Ù. ½¬¿î ¼ø¼´ë·Î À̹ÌÁö¸¦ Ãâ·ÂÇÏ´Â ÇÔ¼öµé¿¡ ´ëÇØ ½Ç½ÀÇØ º¸ÀÚ. ´ÙÀ½ ÇÔ¼ö´Â ÁöÁ¤ÇÑ ÁÂÇ¥¿¡ À̹ÌÁö¸¦ Ãâ·ÂÇϴµ¥ ÁÂÇ¥¸¦ Á÷Á¢ Àü´ÞÇÒ ¼öµµ ÀÖ°í Point °´Ã¼ÀÇ ·¹ÆÛ·±½º¸¦ Àü´ÞÇÒ ¼öµµ ÀÖ´Ù.
Status DrawImage(Image *image, INT x, INT y);
Status DrawImage(Image *image, const Point &point);
À§Ä¡¸¸ ÁöÁ¤ÇßÀ¸¹Ç·Î À̹ÌÁöÀÇ ÀϺθ¸ Ãâ·ÂÇϰųª È®´ë, Ãà¼ÒÇÏ´Â ±â´ÉÀº ¾ø´Ù. À̹ÌÁö¸¦ ÀÖ´Â ±×´ë·Î Ãâ·ÂÇÏ°íÀÚ ÇÒ ¶§ °¡Àå °£ÆíÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ´Â ÇÔ¼öÀ̸ç ÀÌ¹Ì ¾Õ¿¡¼ »ç¿ëÇØ º¸¾Ò´Ù. ±×·¯³ª ÀÌ °£´ÜÇØ º¸ÀÌ´Â ÇÔ¼ö¿¡µµ ÇÔÁ¤ÀÌ ÀÖ´Ù. ÀÌ ÇÔ¼ö´Â À̹ÌÁöÀÇ ¿ø·¡ Å©±â¸¦ »ç¿ëÇÏÁö ¾Ê°í Çػ󵵸¦ °í·ÁÇÏ¿© À̹ÌÁö¸¦ Àû´çÈ÷ È®´ë, Ãà¼ÒÇÑ´Ù.
À̹ÌÁö ÆÄÀÏ¿¡´Â ¿©·¯ °¡Áö Á¤º¸°¡ ±â·ÏµÇ´Âµ¥ Á¤È®ÇÑ Ãâ·ÂÀ» À§ÇØ À̹ÌÁö¸¦ ¸¸µç ÀåÄ¡ÀÇ Çػ󵵰¡ ±â·ÏµÇ¾î ÀÖ´Ù. ¸¸¾à À̹ÌÁö¿¡ ±â·ÏµÈ Çػ󵵰¡ Ãâ·Â ÀåºñÀÇ ÇØ»óµµ¿Í ´Ù¸£´Ù¸é µÎ ÇØ»óµµÀÇ Â÷À̸¸Å À̹ÌÁö¸¦ ½ºÄÉÀϸµÇÏ¿© °¡±ÞÀûÀÌ¸é ¿øº» ÀåÄ¡¿Í °°Àº Å©±â¿¡ ¸Â°Ô Ãâ·ÂÇÑ´Ù.
¸ÅŲÅä½Ã¿¡¼ ¸¸µç À̹ÌÁö°¡ °¡·Î, ¼¼·Î 5Cm ¿´´Ù¸é À©µµ¿ìÁî¿¡¼ ÀÌ À̹ÌÁö¸¦ ¿¾îµµ ±× Å©±â´ë·Î Ãâ·ÂÇϸç À̶§ À̹ÌÁöÀÇ ÇØ»óµµ Á¤º¸¸¦ È°¿ëÇÑ´Ù. ¸ÅŲÅä½ÃÀÇ ¸ð´ÏÅÍ´Â ÀϹÝÀûÀ¸·Î 72dpiÀ̸ç À©µµ¿ìÁîÀÇ ¸ð´ÏÅÍ´Â 96dpiÀ̹ǷΠÀû´çÈ÷ È®´ëÇØ¾ß ºñ½ÁÇÑ Å©±â·Î º¸ÀδÙ. ºÒÇàÇÏ°Ôµµ ´ëºÎºÐÀÇ µðÁöÅÐ Ä«¸Þ¶óµµ 72dpi¸¦ °¡Á¤Çϱ⠶§¹®¿¡ À©µµ¿ìÁî¿¡¼´Â Ç×»ó ¿øº» À̹ÌÁöº¸´Ù ´õ Å©°Ô º¸ÀδÙ.
GDI+ÀÇ ÀÌ·± µ¿ÀÛÀº ³í¸®ÀûÀÎ ¸é¿¡¼´Â ¿Ç´Ù°í ÇÒ ¼ö ÀÖÀ¸³ª ½ÇÁ¦·Î »ç¿ëÇϱ⿡´Â ¿ÀÈ÷·Á ´õ ºÒÆíÇÏ´Ù. Çػ󵵳ª ³í¸®ÀûÀÎ Å©±âº¸´Ù´Â Çȼ¿ Å©±â´ë·Î Ãâ·ÂµÇ´Â °ÍÀÌ ´õ ¹Ù¶÷Á÷ÇÑ °æ¿ì°¡ ¸¹´Ù. À̶§´Â ÁÂÇ¥¸¸ ÁöÁ¤ÇÏÁö ¸»°í À̹ÌÁöÀÇ Æø°ú ³ôÀ̸¦ Á÷Á¢ Á¶»çÇÏ¿© Àü´ÞÇØ¾ß ÇÑ´Ù. ´ÙÀ½ ÄÚµå´Â ¶È°°Àº À̹ÌÁö¸¦ µÎ°¡Áö ¹æ½ÄÀ¸·Î °¢°¢ Ãâ·ÂÇÑ °ÍÀÌ´Ù.
Image I(L"ÄÚ½º¸ð½º.jpg");
G.DrawImage(&I,0,0);
G.DrawImage(&I,300,0,I.GetWidth(),I.GetHeight());
(0,0)¿¡ ±×³É Ãâ·ÂÇϸé À̹ÌÁö°¡ È®´ëµÇ¾î ³ªÅ¸³ª¸ç È®´ë¿¡ ÀÇÇØ À̹ÌÁö°¡ È帴ÇØÁ® Ç°Áúµµ ¶³¾îÁø´Ù. Á¤È®ÇÑ Çȼ¿ Å©±â´ë·Î Ãâ·ÂÇÏ·Á¸é À̹ÌÁö °´Ã¼ÀÇ GetWidth, GetHeight ¸â¹ö ÇÔ¼ö·Î Çȼ¿ Å©±â¸¦ Á¶»çÇÏ¿© ¿µ¿ªÀ» ÁöÁ¤ÇÏ´Â °ÍÀÌ ÁÁ´Ù. ÀÌ·¸°Ô Çϸé Á¤È®ÇÑ Å©±â´ë·Î Ãâ·ÂµÉ »Ó¸¸ ¾Æ´Ï¶ó ½ºÄÉÀϸµÀ» ÇÏÁö ¾ÊÀ½À¸·Î½á ¼Óµµµµ ´õ »¡¶óÁø´Ù. Ãâ·Â ¿µ¿ªÀÇ Æø°ú ³ôÀ̸¦ ÁöÁ¤ÇÒ ¶§´Â ´ÙÀ½ ÇÔ¼ö¸¦ »ç¿ëÇϸç ÁöÁ¤ÇÑ »ç°¢ ¿µ¿ª¿¡ À̹ÌÁö¸¦ Ãâ·ÂÇÑ´Ù.
Status DrawImage(Image *image, INT x, INT y, INT width, INT height);
Status DrawImage(Image *image, const Rect &rect);
»ç°¢ ¿µ¿ª¿¡ À̹ÌÁö¸¦ ¸ÂÃß¾î Ãâ·ÂÇϹǷΠȮ´ë ¹× Ãà¼Ò°¡ °¡´ÉÇÏ´Ù. À̹ÌÁö Å©±âº¸´Ù ´õ Å« ¿µ¿ªÀ» ÁÖ¸é È®´ë°¡ µÉ °ÍÀÌ°í ´õ ÀÛÀº ¿µ¿ª¿¡ Ãâ·ÂÇϸé Ãà¼ÒµÉ °ÍÀÌ´Ù. ´ÙÀ½ ÄÚµå´Â "Á¶·Õ¹Ú.jpg"¸¦ µÎ ¹ø Ãâ·ÂÇ쵂 ÇÑ ¹øÀº 2¹è È®´ë, ÇÑ ¹øÀº 1/2 Ãà¼ÒÇÏ¿© Ãâ·ÂÇß´Ù.
Image I(L"Á¶·Õ¹Ú.jpg");
G.DrawImage(&I,0,0,I.GetWidth()*2, I.GetHeight()*2);
G.DrawImage(&I,650,0,I.GetWidth()/2, I.GetHeight()/2);
ÀÓÀÇÀÇ »ç°¢ ¿µ¿ªÀ» ¸¶À½´ë·Î ÁöÁ¤ÇÒ ¼öµµ ÀÖÁö¸¸ ±×·² °æ¿ì ±×¸²ÀÇ Á¾È¾ºñ°¡ À¯ÁöµÇÁö ¾ÊÀ¸¹Ç·Î GetWidth, GetHeight ¸â¹ö ÇÔ¼ö·Î À̹ÌÁöÀÇ ¿ø·¡ Å©±â¸¦ ±¸ÇÑ ÈÄ ÀÏÁ¤ ¹èÀ²À» °öÇØ È®´ë ¹× Ãà¼ÒÇØ¾ß ÇÑ´Ù. Á¾È¾ºñ¸¦ ¹«½ÃÇÏ°í »ç°¢ ¿µ¿ª¿¡ ¹«Á¶°Ç Ãâ·ÂÇØ ¹ö¸®¸é À̹ÌÁö°¡ Âî±×·¯Áú °ÍÀÌ´Ù. È®´ë³ª Ãà¼Ò¸¦ ÇÏ´õ¶óµµ Æø°ú ³ôÀÌ¿¡ Àû¿ëµÇ´Â ¹èÀ²ÀÌ °°¾Æ¾ß Á¾È¾ºñ°¡ À¯ÁöµÈ´Ù.
À̹ÌÁö¸¦ È®´ëÇϰųª Ãà¼ÒÇÒ ¶§´Â Ãß°¡·Î Çȼ¿ÀÌ »ðÀԵǰųª ÇÕÃÄÁö´Âµ¥ À̶§ Àû¿ëµÇ´Â ¾Ë°í¸®ÁòÀ» º¸°£(Interpolation)À̶ó°í ÇÑ´Ù. º¸°£À̶õ »çÀÌ »çÀÌ¿¡ »õ·Î »ý±â´Â Á¡µéÀ» º¸ÃæÇÑ´Ù´Â ¶æÀε¥ ¿¹¸¦ µé¾î ³ë¶õ»ö°ú »¡°£»ö »çÀÌ¿¡ Á¡À» »ðÀÔÇÒ ¶§ ÁÖȲ»öÀ» »ç¿ëÇÏ´Â ±â¹ýÀ̶ó°í ÀÌÇØÇÏ¸é µÈ´Ù. GDIÀÇ SetStretchBltMode ÇÔ¼ö·Î ÁöÁ¤ÇÏ´Â ½ºÆ®·¹Äª ¸ðµå¿Í µ¿ÀÏÇÑ ±â´ÉÀ̶ó°í ÇÒ ¼ö ÀÖ´Ù. GraphicsÀÇ ´ÙÀ½ ¸â¹ö ÇÔ¼ö·Î º¸°£ ¸ðµå¸¦ º¯°æÇÒ ¼ö ÀÖ´Ù.
Status SetInterpolationMode(InterpolationMode interpolationMode);
º¸°£ ¸ðµå´Â È®´ë, Ãà¼Ò Ç°Áú¿¡ µû¶ó ¸ðµÎ 8°¡Áö°¡ Á¦°øµÇ´Âµ¥ Ç°ÁúÀÌ ³ôÀ»¼ö·Ï ó¸® ½Ã°£Àº ´õ ¿À·¡ °É¸°´Ù. Ç°Áú°ú ¼Óµµ´Â Ç×»ó ¹Ýºñ·Ê °ü°èÀÌ´Ù. ´ÙÀ½ Å×½ºÆ® ÄÚµå´Â º¸°£ ¸ðµå¸¦ ¹Ù²ã °¡¸ç À̹ÌÁö¸¦ È®´ë ¹× Ãà¼ÒÇÔÀ¸·Î½á Â÷ÀÌÁ¡À» È®ÀÎÇØ º»´Ù.
InterpolationMode imode=InterpolationModeDefault;
void OnPaint(HDC hdc)
{
Graphics G(hdc);
Image I(L"Á¶·Õ¹Ú.jpg");
G.SetInterpolationMode(imode);
G.DrawImage(&I,0,0,I.GetWidth()*2, I.GetHeight()*2);
G.DrawImage(&I,I.GetWidth()*2+10,0,I.GetWidth()/2, I.GetHeight()/2);
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
switch(iMessage) {
case WM_KEYDOWN:
if (Mode == TEXT('6')) {
switch (wParam) {
case 'I':
if (imode == InterpolationModeHighQualityBicubic) {
imode=InterpolationModeDefault;
} else {
imode=(InterpolationMode)(imode+1);
}
InvalidateRect(hWnd,NULL,FALSE);
return 0;
}
}
....
Å°º¸µåÀÇ IÅ°¸¦ ´©¸£¸é º¸°£ ¸ðµå¸¦ ¼øȯÇÏ¸é¼ ´Ù½Ã ±×¸®±â¸¦ ÇϹǷΠÂ÷ÀÌÁ¡À» ´«À¸·Î ½±°Ô È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ´ÙÀ½ ÇÔ¼ö´Â À̹ÌÁö¸¦ ÆòÇà »çº¯Çü¾È¿¡ Ãâ·ÂÇÑ´Ù.
Status DrawImage(Image *image, const Point *destPoints, INT count);
¹è¿¿¡ ÆòÇà »çº¯ÇüÀÇ Á»ó´Ü, ¿ì»ó´Ü, ÁÂÇÏ´Ü ²ÀÁöÁ¡ 3°³ÀÇ ÁÂÇ¥¸¦ ÀúÀåÇÏ°í °³¼ö¸¦ 3À¸·Î Àü´ÞÇÑ´Ù. ³ª¸ÓÁö ¿ìÇÏ´Ü Á¡ÀÇ ÁÂÇ¥´Â °è»êÀ¸·Î ±¸ÇÒ ¼ö ÀÖÀ¸¹Ç·Î º°µµ·Î ÁöÁ¤ÇÏÁö ¾Ê¾Æµµ »ó°ü¾ø´Ù.
Image I(L"Á¶·Õ¹Ú.jpg");
Point pts[]={Point(10,10),Point(300,50),Point(100,300)};
G.DrawImage(&I,pts,3);
ÆòÇà »çº¯Çü ¿µ¿ª¿¡ ¸ÂÃß¾î À̹ÌÁö°¡ Ãâ·ÂµÇ¹Ç·Î À̹ÌÁö´Â ÀÚ¿¬½º·´°Ô ÆòÇà »çº¯Çü Å©±â¿¡ ¸Âµµ·Ï È®Àå ¶Ç´Â Ãà¼ÒµÉ °ÍÀÌ´Ù. À̹ÌÁöÀÇ ÀϺθ¸ Ãâ·ÂÇÒ ¶§´Â ´ÙÀ½ ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.
Status DrawImage(Image *image, INT x, INT y, INT srcx, INT srcy, INT srcwidth, INT srcheight, Unit srcUnit);
(x,y)´Â Ãâ·ÂÇÒ È¸é ÁÂÇ¥À̸ç (srcx,srcy)´Â À̹ÌÁöÀÇ Ãâ·Â ½ÃÀÛ ÁÂÇ¥, srcwidth, srcheight´Â À̹ÌÁöÀÇ Ãâ·Â Å©±âÀÌ´Ù. ¸¶Áö¸· Àμö srcUnitÀº À̹ÌÁöÀÇ ÁÂÇ¥¿Í Å©±â ÁöÁ¤¿¡ »ç¿ëµÇ´Â ´ÜÀ§¸¦ ÁöÁ¤Çϴµ¥ Çȼ¿´ÜÀ§³ª ÀÎÄ¡, ¹Ð¸®¹ÌÅÍ ´ÜÀ§·Î Ãâ·ÂÇÒ ºÎºÐÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª Ãâ·ÂÇÒ ÁÂÇ¥¸¸ ÁöÁ¤ÇÒ ¼ö ÀÖÀ¸¹Ç·Î È®´ë, Ãà¼Ò ±â´ÉÀº ¾ø´Ù. ´ÙÀ½ ÄÚµå´Â "È£¶û³ªºñ.jpg" ±×¸²¿¡¼ È£¶û³ªºñ°¡ ÀÖ´Â ºÎºÐ¸¸ Ãâ·ÂÇÑ´Ù.
Image I(L"È£¶û³ªºñ.jpg");
G.DrawImage(&I,0,0,150,40,220,300,UnitPixel);
"È£¶û³ªºñ.jpg" ±×¸² ÆÄÀÏÀÇ (150,40)¿¡¼ºÎÅÍ Æø 220, ³ôÀÌ 300ºÎºÐ¸¸ ȸéÀÇ (0,0) ÁÂÇ¥¿¡ Ãâ·ÂÇϵµ·Ï Çß´Ù.
´ÙÀ½ ÇÔ¼ö´Â °¡Àå ¿É¼ÇÀÌ ¸¹Àº Ãâ·Â ÇÔ¼öÀ̸ç À̹ÌÁöÀÇ ÀϺκи¸ ȸéÀÇ ¿øÇÏ´Â ºÎºÐ¿¡ Ãâ·ÂÇÒ ¼ö ÀÖ´Ù. µÚÂÊ ¼¼ Àμö´Â Ãâ·Â È¿°ú³ª Ãâ·Â °úÁ¤ º¸°í¸¦ À§ÇØ »ç¿ëÇϴµ¥ ÇÊ¿ä¾øÀ» °æ¿ì »ý·«ÇÒ ¼ö ÀÖ´Ù.
Status DrawImage(Image *image, const Rect &destRect, INT srcx, INT srcy, INT srcwidth, INT srcheight, Unit srcUnit, ImageAttributes *imageAttributes, DrawImageAbort callback, VOID *callbackData);
Àμö·Î Ãâ·Â ¿µ¿ªÀÌ Àü´ÞµÇ¸é È®´ë/Ãà¼Ò°¡ °¡´ÉÇÏ°í À̹ÌÁö ¿µ¿ªÀÌ Àü´ÞµÇ¸é À̹ÌÁöÀÇ ¿øÇÏ´Â ºÎºÐ¸¸ Ãâ·ÂÇÒ ¼ö ÀÖ´Ù. ÀÌ ÇÔ¼ö´Â È¸é ¿µ¿ª, À̹ÌÁöÀÇ ½ÃÀÛÁ¡°ú Æø, ³ôÀÌ µîÀ» ¸ðµÎ Àμö·Î ¹Þ¾Æ µéÀ̹ǷΠÀ̹ÌÁö ÀϺθ¦ ¿øÇÏ´Â ¿µ¿ª¿¡ ¿øÇÏ´Â Å©±â·Î Ãâ·ÂÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½ ÄÚµå´Â È£¶û³ªºñ¸¸ Àý¹ÝÀ¸·Î Ãà¼ÒÇؼ ȸéÀÇ ¿øÁ¡¿¡ Ãâ·ÂÇÑ´Ù.
Image I(L"È£¶û³ªºñ.jpg");
G.DrawImage(&I,Rect(0,0,110,150),150,40,220,300,UnitPixel);
ÀÌ ÇÔ¼ö°¡ ¸ðµç ¿É¼ÇÀ» ´Ù Áö¿øÇÏ´Â °¡Àå ¿Ïº®ÇÑ À̹ÌÁö Ãâ·Â ÇÔ¼ö¶ó°í ÇÒ ¼ö ÀÖ´Ù. À̹ÌÁö¸¦ Ãâ·ÂÇÏ´Â ¸¶Áö¸· ÇÔ¼ö´Â ÆòÇà »çº¯Çü¿¡ À̹ÌÁöÀÇ ÀϺκи¸ Ãâ·ÂÇÏ´Â ÇÔ¼öÀÌ´Ù.
Image I(L"È£¶û³ªºñ.jpg");
Point pts[]={Point(10,10),Point(300,50),Point(100,300)};
G.DrawImage(&I,pts,3,150,40,220,300,UnitPixel);
È£¶û³ªºñ¸¸ ÁöÁ¤ÇÑ ÆòÇà »çº¯Çü¿¡ ¸ÂÃß¾î Ãâ·ÂµÉ °ÍÀÌ´Ù. ½Ç¿ë¼ºÀº ´Ù¼Ò ¶³¾îÁø´Ù.
Image Ŭ·¡½º´Â GDI+ÀÇ ±âº» À̹ÌÁö Ŭ·¡½ºÀ̸ç À̹ÌÁö¸¦ Àаí, ¾²°í Ãâ·ÂÇÏ´Â ´ëºÎºÐÀÇ ±â´ÉÀ» Á¦°øÇÑ´Ù. ÀÌ Å¬·¡½º·ÎºÎÅÍ Bitmap°ú MetaFile Ŭ·¡½º°¡ ÆÄ»ýµÇ´Âµ¥ BitmapÀº Image¿¡ ºñÇØ Á» ´õ Á¤¹ÐÇÑ ·¹½ºÅÍ µ¥ÀÌÅÍ °ü¸® ´É·ÂÀ» °¡Áö°í ÀÖÀ¸¸ç MetaFileÀº º¤Å͸¦ ±â·ÏÇϰųª °Ë»çÇÏ´Â ±â´ÉÀ» Ãß°¡·Î °¡Áø´Ù. ´ÙÀ½Àº Bitmap Ŭ·¡½ºÀÇ »ý¼ºÀÚµé Áß ÀϺÎÀÌ´Ù.
Bitmap(INT width, INT height, Grpaphics *target);
Bitmap(INT width, INT height, PixelFormat format);
Bitmap(HBITMAP hbm, HPALETTE hpal);
Bitmap(const BITMAPINFO *gdiBitmapInfo, VOID *gdiBitmapData);
Bitmap(HICON hicon);
Image´Â ÆÄÀÏÀ̳ª ½ºÆ®¸²À¸·ÎºÎÅÍ, Áï ÀÌ¹Ì Á¸ÀçÇÏ´Â °Í¸¸ »ý¼ºÇÒ ¼ö ÀÖÁö¸¸ BitmapÀº Á» ´õ ´Ù¾çÇÑ ¹æ¹ýÀ¸·Î »ý¼ºÇÒ ¼ö ÀÖ´Ù. Æø°ú ³ôÀÌ, ±×¸®°í ÂüÁ¶ ±×·¡ÇÈ °´Ã¼³ª »ö»ó Æ÷¸Ë Á¤º¸¸¸À¸·Î ºñ¾î ÀÖ´Â ºñÆ®¸ÊÀ» ¸¸µé ¼öµµ ÀÖ´Ù. GDIÀÇ DDBÇÚµéÀ̳ª DIB Á¤º¸ ±¸Á¶Ã¼ ¶Ç´Â ¾ÆÀÌÄÜÀ¸·ÎºÎÅÍ GDI+¿Í ȣȯµÇ´Â ºñÆ®¸ÊÀ» »ý¼ºÇϱ⵵ ÇÑ´Ù. ´ÙÀ½ ÄÚµå´Â ¾ÆÀÌÄÜÀ¸·ÎºÎÅÍ ºñÆ®¸ÊÀ» »ý¼ºÇÏ¿© Ãâ·ÂÇÏ´Â ¿¹ÀÌ´Ù.
HICON hIcon;
hIcon=LoadIcon(NULL,IDI_EXCLAMATION);
Bitmap B(hIcon);
G.DrawImage(&B,10,10);
LoadIcon ÇÔ¼ö·Î ÀÐÀº ¾ÆÀÌÄÜ ÇÚµé·ÎºÎÅÍ ºñÆ®¸Ê °´Ã¼¸¦ »ý¼ºÇÏ°í ÀÌ °´Ã¼¸¦ DrawImage ÇÔ¼ö·Î Ãâ·ÂÇß´Ù. GDI+´Â ¾ÆÀÌÄÜÀ» Ãâ·ÂÇϰųª °ü¸®ÇÏ´Â ÇÔ¼ö¸¦ µû·Î Á¦°øÇÏÁö ¾ÊÀ¸¹Ç·Î ºñÆ®¸ÊÀ» ÅëÇØ ¾ÆÀÌÄÜÀ» Ãâ·ÂÇØ¾ß ÇÑ´Ù. Bitmap Ŭ·¡½ºÀÇ »ý¼ºÀÚ Áß ·¡½ºÅÍ µ¥ÀÌÅ;øÀÌ Å©±â¿Í »ö»ó Æ÷¸Ë¸¸ ÁöÁ¤ÇÏ¿© ºó ºñÆ®¸ÊÀ» ¸¸µå´Â »ý¼ºÀÚ¸¦ »ç¿ëÇÏ¸é ´õºí ¹öÆÛ¸µ¿¡ »ç¿ëÇÒ ¼öµµ ÀÖ´Ù.
¿ø¸®´Â GDIÀÇ °æ¿ì¿Í µ¿ÀÏÇÏ´Ù. Graphics Ŭ·¡½ºÀÇ »ý¼ºÀÚ Áß¿¡ Image¿Í ¿¬°áµÇ´Â Graphics °´Ã¼¸¦ ¸¸µå´Â °ÍÀÌ Àִµ¥ ÀÌ »ý¼ºÀÚ·Î ¸¸µé¾îÁø Graphics °´Ã¼´Â ȸéÀ¸·Î º¸ÀÌÁö ¾Ê°í ¸ðµç Ãâ·ÂÀ» À̹ÌÁö Ç¥¸éÀ¸·Î ³» º¸³½´Ù. ¸¶Ä¡ GDIÀÇ ¸Þ¸ð¸® DC·Î Ãâ·ÂÀ» º¸³»¸é ÀÌ DC¿¡ ¼±ÅõǾî ÀÖ´Â ºñÆ®¸ÊÀ¸·Î Ãâ·ÂµÇ´Â °Í°ú °°´Ù.
¿øÇÏ´Â Å©±â·Î ºñÆ®¸ÊÀ» ¸¸µé°í ÀÌ ºñÆ®¸ÊÀ¸·ÎºÎÅÍ Graphics °´Ã¼¸¦ »ý¼ºÇÑ´Ù. ±×¸®°í ÀÌ·¸°Ô ¸¸µé¾îÁø Graphics °´Ã¼·Î Ãâ·ÂÇÏ¸é ¹é±×¶ó¿îµå¿¡¼ ±×¸²À» ±×¸± ¼ö ÀÖ´Ù. ¿Ï¼ºµÈ ºñÆ®¸ÊÀ» ºü¸¥ ¼Óµµ·Î ȸ鿡 Àü¼ÛÇϸé ÀÌ°ÍÀÌ ¹Ù·Î ´õºí ¹öÆÛ¸µÀÌ´Ù. ´ÙÀ½ ÄÚµå´Â ±Ø´ÜÀûÀ¸·Î °£´ÜÇÑ ´õºí ¹öÆÛ¸µ ½Ã¹üÀ» º¸ÀδÙ.
Bitmap B(100,100,&G);
Graphics G2(&B);
Pen P(Color(0,0,0),3);
G2.DrawEllipse(&P,10,10,80,80);
G.DrawImage(&B,0,0);
Å©±â (100,100)ÀÇ ºñÆ®¸ÊÀ» ȸé°ú ȣȯµÇ´Â »ö»ó Æ÷¸ËÀ¸·Î »ý¼º(CreateCompatibleBitmap¿¡ ÇØ´ç)ÇÏ°í ÀÌ ºñÆ®¸ÊÀ¸·ÎºÎÅÍ G2 °´Ã¼¸¦ »ý¼º(CreateCompatibleDC¿¡ ÇØ´ç)Çß´Ù. ÀÌÈÄ G2·Î º¸³»Áö´Â Ãâ·ÂÀº ¸ðµÎ ºñÆ®¸Ê Ç¥¸é¿¡ ±×·ÁÁú °ÍÀÌ´Ù. ¿¹Á¦ Äڵ忡¼´Â Ÿ¿ø¸¸ Çϳª ±×·Á º¸¾Ò´Ù. ±×¸®°í ±× °á°ú¸¦ ȸé Graphics °´Ã¼ÀÎ G·Î DrawImage ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ºü¸¥ ¼Óµµ·Î Àü¼ÛÇß´Ù. ±×¸®´Â Áß°£ °úÁ¤Àº ¸Þ¸ð¸® ³»ºÎ¿¡¼ ÀϾ´Â ÀÏÀ̹ǷΠ»ç¿ëÀÚ ´«¿¡ º¸ÀÌÁö ¾ÊÀ¸¸ç ±ô¹ÚÀÓµµ ¾ø´Ù.
CachedBitmap Ŭ·¡½º´Â Ãâ·Â ÀåÄ¡¿Í ȣȯµÇ´Â Æ÷¸ËÀ¸·Î º¯È¯ÇÑ À̹ÌÁö¸¦ °¡Áö´Â Ŭ·¡½ºÀÌ´Ù. ´Ü¼øÇÑ ·¡½ºÅÍ µ¥ÀÌÅÍÀÇ ÁýÇÕ¸¸À» °¡Áö¹Ç·Î ImageÀÇ ÆÄ»ý Ŭ·¡½º´Â ¾Æ´Ï¸ç ºñÆ®¸ÊÀ¸·ÎºÎÅÍ »ý¼ºµÈ´Ù. CachedBitmapÀÇ »ý¼ºÀÚ´Â ´ÙÀ½ Çϳª »ÓÀÌ´Ù.
CachedBitmap(Bitmap *bitmap, Graphics *graphics);
·¡½ºÅÍ µ¥ÀÌÅ͸¦ °¡Áö´Â Bitmap °´Ã¼¿Í Ãâ·Â ÀåÄ¡¸¦ Ç¥ÇöÇÏ´Â Graphics °´Ã¼¸¦ Àμö·Î ¹Þ¾Æµé¿© ÀåÄ¡¿¡ ¸Â´Â Æ÷¸Ë Çü½ÄÀ¸·Î ·¡½ºÅÍ µ¥ÀÌÅ͸¦ °¡°øÇÑ °á°ú¸¦ °¡Áø´Ù. ÀÌ Á¤º¸´Â ÀåÄ¡¿¡ Á¾¼ÓÀûÀÌ¸ç ±×·¡¼ º°µµÀÇ º¯È¯À» °ÅÄ¡Áö ¾Ê°íµµ °ð¹Ù·Î ȸéÀ¸·Î Ãâ·ÂÇÒ ¼ö ÀÖ´Ù. CachedBitmapÀ» Ãâ·ÂÇÒ ¶§´Â Graphics Ŭ·¡½º¿¡ Æ÷ÇÔµÈ ´ÙÀ½ ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.
Status DrawCachedBitmap(CachedBitmap *cb, INT x, INT y);
DrawImage ÇÔ¼öó·³ È®´ë³ª Ãà¼Ò, À̹ÌÁöÀÇ ÀϺθ¸ Ãâ·ÂÇÏ´Â ±â´ÉÀº ¾ø°í ¿À·ÎÁö ÁöÁ¤ÇÑ À§Ä¡¿¡ À̹ÌÁö Àüü¸¦ Ãâ·ÂÇÒ ¼ö ÀÖÀ» »ÓÀÌ´Ù. BitmapÀ̳ª Image´Â ÆÄÀϷκÎÅÍ ÀоîµéÀÎ ÀåÄ¡ µ¶¸³ÀûÀÎ Á¤º¸¸¦ °¡Áö°í ÀÖÀ¸¹Ç·Î DrawImage ÇÔ¼ö°¡ Ãâ·ÂÇÒ ¶§ ÀåÄ¡¿¡ ¸Â°Ô Æ÷¸ËÀ» º¯È¯ÇØ¾ß ÇÑ´Ù. µû¶ó¼ Ãâ·Â ¼Óµµ°¡ ´À¸®Áö¸¸ CachedBitmapÀº »ý¼ºÇÒ ¶§ ¹Ì¸® º¯È¯ÇØ ³õÀ¸¹Ç·Î ¹Ýº¹ÀûÀÎ Ãâ·ÂÀ» ÇÒ ¶§ ´ë´ÜÈ÷ ¼Óµµ°¡ ºü¸£´Ù. ½±°Ô ºñÀ¯¸¦ ÇÏÀÚ¸é BitmapÀº GDIÀÇ DIB¿¡ ÇØ´çÇÏ°í CachedBitmapÀº DDB¿¡ ÇØ´çÇÑ´Ù°í ÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½ ÄÚµå´Â ºñÆ®¸ÊÀ» ij½Ã ºñÆ®¸ÊÀ¸·Î ¹Ù²Û ÈÄ Ãâ·ÂÇÑ´Ù.
Bitmap B(L"³ëÀ».jpg");
CachedBitmap CB(&B,&G);
G.DrawCachedBitmap(&CB,0,0);
¹°·Ð ÀÌ·± ½ÄÀ¸·Î OnPaint¿¡¼ ij½Ã ºñÆ®¸ÊÀ» ¸¸µé¾î¼´Â ¼Óµµ»óÀÇ À̵æÀ» º¼ ¼ö ¾øÀ¸¸ç ÄÚµåÀÇ ´Ù¸¥ °÷¿¡¼ À̹ÌÁö ÆÄÀÏÀ» Àоî ij½Ã ºñÆ®¸ÊÀ» ¹Ì¸® ¸¸µé¾î ³õ¾Æ¾ß ÇÒ °ÍÀÌ´Ù. ¿¹¸¦ µé¾î À̹ÌÁö ÆÄÀÏÀ» ¿ ¶§ ij½Ã ºñÆ®¸ÊÀ» ¹Ì¸® ¸¸µé¾î ³õ°í OnPaint¿¡¼´Â ÀÌ ºñÆ®¸ÊÀ» ¹«Á¶°Ç ȸ鿡 »Ñ¸®±â¸¸ ÇÏ¸é µÈ´Ù. ¸¸¾à ij½Ã ºñÆ®¸ÊÀ» ¸¸µé¾î ³õÀº »óÅ¿¡¼ µð½ºÇ÷¹ÀÌ ¼¼ÆÃÀÌ º¯°æµÇ¸é, ¿¹¸¦ µé¾î 16ºñÆ® ¸ðµå¿¡¼ 24ºñÆ® ¸ðµå·Î ¹Ù²î¸é ÀÌ ºñÆ®¸Êµµ º¯°æµÈ ¸ðµå¿¡ ¸Â°Ô ´Ù½Ã ¸¸µé¾î¾ß ÇÑ´Ù.
´õºí ¹öÆÛ¸µÀ» Á¦´ë·Î ±¸ÇöÇÏ·Á¸é ij½Ã ºñÆ®¸ÊÀ» »ç¿ëÇØ¾ß ÇÑ´Ù. GpDoubleBuffer ¿¹Á¦´Â ÆĶõ»ö °ÝÀÚµéÀ» ¸ÕÀú Ãâ·ÂÇØ ³õ°í ±× À§¿¡¼ ¹ÝÅõ¸íÇÑ »¡°£»ö Ÿ¿øÀ» Ä¿¼ À̵¿Å°·Î ¿òÁ÷À̴µ¥ ´õºí ¹öÆÛ¸µÀ» ÇÒ ¶§¿Í ±×·¸Áö ¾ÊÀ» ¶§¸¦ ºñ±³ÇØ º»´Ù. ¸ÕÀú ´õºí ¹öÆÛ¸µÀ» ÇÏÁö ¾ÊÀ» ¶§ÀÇ Äڵ带 º¸ÀÚ.
¿¹ Á¦ : GpDoubleBuffer |
int ex=100,ey=100;
void OnPaint(HDC hdc)
{
Graphics G(hdc);
SolidBrush S(Color(0,0,255));
int x,y;
for (x=0;x<=800;x+=50) {
for (y=0;y<=600;y+=50) {
G.FillRectangle(&S,x,y,40,40);
}
}
SolidBrush S2(Color(128,255,0,0));
G.FillEllipse(&S2,ex,ey,150,150);
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
switch(iMessage) {
case WM_CREATE:
hWndMain=hWnd;
return 0;
case WM_KEYDOWN:
switch (wParam) {
case VK_LEFT:
ex-=5;
InvalidateRect(hWnd,NULL,TRUE);
break;
case VK_RIGHT:
ex+=5;
InvalidateRect(hWnd,NULL,TRUE);
break;
case VK_UP:
ey-=5;
InvalidateRect(hWnd,NULL,TRUE);
break;
case VK_DOWN:
ey+=5;
InvalidateRect(hWnd,NULL,TRUE);
break;
}
return 0;
case WM_PAINT:
hdc=BeginPaint(hWnd, &ps);
OnPaint(hdc);
EndPaint(hWnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
OnPaint¿¡¼´Â »ç°¢Çü ¹«´Ì¿Í ex, ey¿¡ ¹ÝÅõ¸í Ÿ¿øÀ» ±×¸®°í WM_KEYDOWN¿¡¼´Â ex, eyÀÇ ÁÂÇ¥¸¦ º¯°æÇÏ¿© ´Ù½Ã ±×¸°´Ù. Å°¸¦ ¹Ýº¹ÀûÀ¸·Î ´©¸£¸é ¹ÝÅõ¸íÇÑ Å¸¿øÀÌ »ç°¢Çü °ÝÀÚ »çÀ̸¦ À̵¿ÇÒ °ÍÀÌ´Ù.
Ÿ¿øÀÌ Àß À̵¿µÇ±â´Â ÇÏÁö¸¸ ÁÂÇ¥°¡ Á¶±ÝÀÌ¶óµµ ¹Ù²ð ¶§¸¶´Ù ¸Å¹ø ´Ù½Ã ±×·Á¾ß ÇϹǷΠ±ô¹ÚÀÓÀÌ ¹«Ã´ ½ÉÇÏ´Ù. Ãâ·Â Ç°ÁúÀÌ ÀúÇϵÊÀº ¹°·ÐÀÌ°í ÀÌ·± ȸéÀ» ¿À·¡ º¸°í ÀÖÀ¸¸é ´«ÀÌ ±Ý¹æ ÇÇ·ÎÇØÁ® °Ç°¿¡µµ ÁÁÁö ¸øÇÏ´Ù. ´ÙÀ½ ÄÚµå´Â ¶È°°Àº µ¿ÀÛÀ» Ç쵂 ´õºí ¹öÆÛ¸µÀ» Çϵµ·Ï ¼öÁ¤ÇÑ °ÍÀÌ´Ù.
int ex=100,ey=100;
CachedBitmap *pCBit;
void UpdateScreen()
{
Graphics G(hWndMain);
RECT crt;
GetClientRect(hWndMain,&crt);
Bitmap *pBit=new Bitmap(crt.right,crt.bottom,&G);
Graphics *memG=new Graphics(pBit);
memG->FillRectangle(&SolidBrush(Color(255,255,255)),0,0,crt.right,crt.bottom);
SolidBrush S(Color(0,0,255));
int x,y;
for (x=0;x<=800;x+=50) {
for (y=0;y<=600;y+=50) {
memG->FillRectangle(&S,x,y,40,40);
}
}
SolidBrush S2(Color(128,255,0,0));
memG->FillEllipse(&S2,ex,ey,150,150);
if (pCBit) {
delete pCBit;
}
pCBit=new CachedBitmap(pBit,&G);
delete pBit;
delete memG;
InvalidateRect(hWndMain,NULL,FALSE);
}
void OnPaint(HDC hdc)
{
Graphics G(hdc);
if (pCBit == NULL) {
UpdateScreen();
}
G.DrawCachedBitmap(pCBit,0,0);
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
switch(iMessage) {
case WM_CREATE:
hWndMain=hWnd;
return 0;
case WM_KEYDOWN:
switch (wParam) {
case VK_LEFT:
ex-=5;
UpdateScreen();
break;
case VK_RIGHT:
ex+=5;
UpdateScreen();
break;
case VK_UP:
ey-=5;
UpdateScreen();
break;
case VK_DOWN:
ey+=5;
UpdateScreen();
break;
}
return 0;
case WM_PAINT:
hdc=BeginPaint(hWnd, &ps);
OnPaint(hdc);
EndPaint(hWnd, &ps);
return 0;
case WM_DESTROY:
if (pCBit) {
delete pCBit;
}
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
Àü¿ª º¯¼ö·Î CachedBitmapÀÇ Æ÷ÀÎÅÍ pCBit¸¦ ¼±¾ðÇØ µÎ°í UpdateScreen ÇÔ¼ö´Â ÀÌ ºñÆ®¸Ê Ç¥¸é¿¡ ±×¸²À» ±×·Á ³õ´Â´Ù. ÀÛ¾÷ ¿µ¿ª Å©±â¿Í °°Àº Bitmap °´Ã¼ pBit¸¦ »ý¼ºÇÏ°í ÀÌ ºñÆ®¸ÊÀ¸·ÎºÎÅÍ memG °´Ã¼¸¦ ¸¸µç ÈÄ ÀÌ °´Ã¼¿¡ Ãâ·ÂÇß´Ù. Ãâ·Â °á°ú´Â ºñÆ®¸Ê Ç¥¸é¿¡ ±×´ë·Î ±â·ÏµÉ °ÍÀ̸ç ÃÖÁ¾ÀûÀ¸·Î ij½Ã ºñÆ®¸ÊÀ¸·Î º¯È¯ÇØ µÐ´Ù. ±×·ÁÁø ±×¸²ÀÇ ÃÖÁ¾ °á°ú´Â pCBitÀ̹ǷΠpBit³ª memG´Â ÀúÀåÇÒ ÇÊ¿ä°¡ ¾ø´Ù.
OnPaint¿¡¼´Â DrawCachedBitmap ÇÔ¼ö·Î ±× °á°ú¸¸ Ãâ·ÂÇÏ¸é µÈ´Ù. ÀÌ¹Ì È¸éÀÇ »ö»ó Æ÷¸Ë¿¡ ¸Â°Ô º¯È¯µÈ Á¤º¸¸¦ °¡Áö°í ÀÖÀ¸¹Ç·Î ºñµð¿À ·¥¿¡ Àü¼ÛÇϱ⸸ ÇÏ¸é ºü¸¥ ¼Óµµ·Î ±×¸²À» ±×¸± ¼ö ÀÖÀ¸¸ç ´Ù¸¥ À©µµ¿ì¿¡ ÀÇÇØ ¾ðÄ¿¹öµÇ´õ¶óµµ »ç°¢Çü°ú Ÿ¿øÀ» ´Ù½Ã ±×¸± ÇÊ¿ä¾øÀÌ Ä³½Ã ºñÆ®¸Ê¸¸ ´Ù½Ã Ãâ·ÂÇÑ´Ù. WndProc¿¡¼´Â ȸéÀ» Á÷Á¢ ¼öÁ¤ÇÒ ÇÊ¿ä¾øÀÌ Ä³½Ã ºñÆ®¸ÊÀ» ¼öÁ¤ÇÏ´Â UpdateScreen ÇÔ¼ö¸¸ È£ÃâÇÏ¸é µÈ´Ù.
GDI¿Í GDI+ÀÇ ´õºí ¹öÆÛ¸µ ¹æ¹ýÀº ¿ø·ÐÀûÀ¸·Î µ¿ÀÏÇÏ´Ù. ´Ù¸¸ GDIÀÇ ¸Þ¸ð¸® ºñÆ®¸ÊÀº »ý¼ºÇÒ ¶§ºÎÅÍ(CreateCompatibleBitmap) ÀåÄ¡¿¡ Á¾¼ÓÀûÀ̹ǷΠ°ð¹Ù·Î ȸéÀ¸·Î Ãâ·ÂÇÒ ¼ö ÀÖÁö¸¸ GDI+ÀÇ ¸Þ¸ð¸® ºñÆ®¸ÊÀÎ Bitmap °´Ã¼´Â ±×·¸Áö ¾ÊÀ¸¹Ç·Î ij½Ã ºñÆ®¸ÊÀ¸·Î ÇÑ ¹ø ´õ º¯È¯À» ÇØ¾ß ÇÑ´Ù´Â Á¡ÀÌ ´Ù¸¦ »ÓÀÌ´Ù. Àá½Ã ÈÄ À̹ÌÁö ºä¾î ¿¹Á¦¿¡¼ ´õºí ¹öÆÛ¸µÀ» »ç¿ëÇÏ´Â ½ÇÁ¦ ¿¹¸¦ º¸°Ô µÉ °ÍÀÌ´Ù.
MetaFile Ŭ·¡½º´Â À̸§ ±×´ë·Î ¸ÞŸ ÆÄÀÏÀ» °ü¸®Çϴ Ŭ·¡½ºÀÌ´Ù. Image Ŭ·¡½º·Îµµ ¸ÞŸ ÆÄÀÏÀ» Ãâ·ÂÇÏ´Â Á¤µµ´Â ÇÒ ¼ö ÀÖÁö¸¸ MetaFile Ŭ·¡½º´Â ¸ÞŸ ±â·ÏÀ̳ª ·¹ÄÚµå ºÐ¼®, Win32 ¸ÞŸ ÆÄÀÏ·ÎÀÇ º¯È¯ µî Á» ´õ Àü¹®ÀûÀΠ󸮸¦ ÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½ ÄÚµå´Â Image Ŭ·¡½º·Î ¸ÞŸ ÆÄÀÏÀ» Ãâ·ÂÇÑ´Ù.
Image I(L"testenh.emf");
G.DrawImage(&I,10,10);
GDI+´Â Win32ÀÇ È®Àå ¸ÞŸ ÆÄÀϸ¸ ÀÐÀ» ¼ö ÀÖÀ¸¹Ç·Î 16ºñÆ® ¸ÞŸ ÆÄÀÏÀ̳ª Ç÷¹À̽ººí ¸ÞŸ ÆÄÀÏÀº È®Àå Æ÷¸ËÀ¸·Î º¯È¯Çؾ߸¸ Ãâ·ÂÇÒ ¼ö ÀÖ´Ù. MetaFile Ŭ·¡½º¸¦ »ç¿ëÇϸé GDI+ È£ÃâÀ» ¸ÞŸ ÆÄÀϷεµ ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù.
Metafile M(L"GpMeta.emf",hdc);
Graphics *pG=new Graphics(&M);
Pen P(Color(255,0,0),5);
Pen P2(Color(0,0,0));
pG->DrawEllipse(&P,10,10,100,100);
pG->DrawRectangle(&P2,30,30,50,50);
delete pG;
Metafile M2(L"GpMeta.emf");
G.DrawImage(&M2,10,10);
MetaFile °´Ã¼ MÀ» ¸¸µç ÈÄ ÀÌ °´Ã¼·ÎºÎÅÍ Graphics °´Ã¼ pG¸¦ »ý¼ºÇÏ°í pG·Î Ãâ·ÂÀ» ³» º¸³»¸é ÀÌ Ãâ·ÂÀº ¸ÞŸ ÆÄÀÏ¿¡ ºÎȣȵǾî ÀúÀåµÈ´Ù. ÃÖÁ¾ÀûÀ¸·Î pG°¡ Æı«µÉ ¶§ GDI+ Ãâ·Â¹®µéÀÌ ¸ÞŸ ÆÄÀÏ¿¡ ±â·ÏµÈ´Ù. ¿¹Á¦¿¡¼´Â GpMeta.emf¶ó´Â À̸§À¸·Î ¸ÞŸ ÆÄÀÏÀ» ¸¸µé¾ú°í È®ÀÎÀ» À§ÇØ M2 °´Ã¼·Î ´Ù½Ã ¿¾î Ãâ·ÂÇØ º¸¾Ò´Ù.
À̹ÌÁö ÆÄÀÏ¿¡´Â ±×¸²¸¸ ÀúÀåµÇ¾î ÀÖ´Â °ÍÀÌ ¾Æ´Ï¶ó ±×¸²°ú °ü·ÃµÈ ¿©·¯ °¡Áö ¼¼ºÎ Á¤º¸µéµµ Æ÷ÇԵǾî ÀÖ´Ù. ¿¹¸¦ µé¾î µðÁöÅÐ Ä«¸Þ¶ó·Î ÃÔ¿µµÈ À̹ÌÁö¿¡´Â ¾î¶² ¸ðµ¨ÀÇ ¾î¶² Ä«¸Þ¶ó·Î Âï¾ú´ÂÁö¿¡ ´ëÇÑ Àåºñ Á¤º¸, ³¯Â¥¿Í ÇØ»óµµ µîÀÌ À̹ÌÁö ÆÄÀÏ¿¡ °°ÀÌ ±â·ÏµÈ´Ù. ¾î¶² Ä«¸Þ¶ó´Â ÃÔ¿µÇÒ ¶§ÀÇ ³ëÃâ Á¤µµ, ÁÜ »óÅÂ, ¼ÅÅÍ ¼Óµµ µîÀÇ »ó¼¼ÇÑ Á¤º¸±îÁöµµ ½á ³Ö´Â´Ù. ¶ÇÇÑ ÃÔ¿µÇÑ À̹ÌÁö¿¡ º°µµÀÇ ¼ÒÇÁÆ®¿þ¾î¸¦ »ç¿ëÇÏ¿© Á¦¸ñÀ̳ª °£´ÜÇÑ ¼³¸íÀ» ´Þ ¼ö Àִµ¥ ÀÌ »çÁøÀ» ÆíÁýÇÑ ¼ÒÇÁÆ®¿þ¾î´Â ÀÚ½ÅÀÇ Á¸À縦 À̹ÌÁö¿¡ »õ°Ü ³Ö±âµµ ÇÑ´Ù.
À̹ÌÁö¿¡ Æ÷ÇԵǴ ÀÌ·± ¼¼ºÎÀûÀÎ Á¤º¸µéÀº À̹ÌÁö¸¦ ÀÎÈÇѴٰųª º¸Á¤ÇÒ ¶§ Âü°í Á¤º¸·Î »ç¿ëµÇ±âµµ ÇÏ°í ¾î¶² Á¤º¸´Â ¾µµ¥¾øÀÌ ÀÚ¸®¸¸ Â÷ÁöÇϱ⵵ ÇÑ´Ù. ¾Æ¹¸µç ÀÌ Á¤º¸µéÀº À̹ÌÁöÀÇ È°¿ë¼ºÀ» ³ô¿© Áִµ¥ ÀÌ·± Á¤º¸µéÀ» À̹ÌÁö ÇÁ·ÎÆÛƼ ¶Ç´Â ¸ÞŸ µ¥ÀÌÅͶó°í ÇÑ´Ù. GDI+´Â À̹ÌÁö ÆÄÀϷκÎÅÍ ÇÁ·ÎÆÛƼ¸¦ Á¶»çÇϰųª º¯°æÇÏ´Â ÇÔ¼öµµ Á¦°øÇÑ´Ù. ºÐ·®¿¡ ºñÇØ º° ¼ÒµæÀº ¾øÀ¸¹Ç·Î °ü½É¾ø´Â »ç¶÷Àº ÀÐÁö ¾Ê¾Æµµ ÁÁ´Ù.
À̹ÌÁö ÇÁ·ÎÆÛƼ´Â ÆøÀ̳ª ³ôÀÌ °°Àº ±âº»ÀûÀÎ Á¤º¸µéº¸´Ù ´Ù·ç±â°¡ ÈξÀ ´õ ±î´Ù·Î¿îµ¥ ¿Ö³ÄÇϸé À̹ÌÁö Æ÷¸Ëº°·Î ¶Ç À̹ÌÁö¸¦ ¸¸µé¾î³»´Â Àåºñº°·Î »ý¼ºÇÏ´Â ÇÁ·ÎÆÛƼÀÇ Á¾·ù³ª Çü½ÄÀÌ ´Ù¾çÇϱ⠶§¹®ÀÌ´Ù. ÇÁ·ÎÆÛƼÀÇ Á¾·ùµµ °¡º¯ÀûÀÌ°í °³¼öµµ °¡º¯ÀûÀÌ¾î¼ ÀÏ°üµÈ ¹æ¹ýÀ¸·Î ´Ù·ê ¼ö°¡ ¾ø´Ù. µðÁöÅÐÀÇ ¼¼°è¿¡¼ °¡º¯ÀûÀ̶ó´Â ¸»Àº À¯¿¬ÇÏ´Ù°í Ç¥ÇöµÇ±âµµ ÇÏÁö¸¸ ´Ù¸¥ ¸»·Î Ç¥ÇöÇÏ¸é ±ÍÂú¾ÆÁø´Ù´Â ¶æ°úµµ °°´Ù. °¡º¯ °³¼öÀÇ ÀÚ·á ÁýÇÕÀ» ´Ù·ç´Â ¹æ¹ýÀº ¿©·¯ °¡Áö°¡ ÀÖ´Ù.
¨ç À©µµ¿ìÁî°¡ °¡Àå ÈçÇÏ°Ô »ç¿ëÇÏ´Â ¹æ¹ýÀº ¿°Å¸¦ ÇÏ´Â ¹æ¹ýÀε¥ ¹ß°ßµÉ ¶§¸¶´Ù Äݹé ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ½ÄÀÌ´Ù. ¸Þ¸ð¸® ¼Ò¸ð°¡ °ÅÀÇ ¾ø°í ¹ÝÀÀÀÌ ºü¸£´Ù´Â ÀÌÁ¡ÀÌ ÀÖÁö¸¸ Äݹé ÇÔ¼ö¸¦ ÀÛ¼ºÇØ¾ß ÇϹǷΠ¹ø°Å·Ó°í Äݹé ÇÔ¼ö´Â ¸â¹ö ÇÔ¼ö°¡ µÉ ¼ö ¾øÀ¸¹Ç·Î °´Ã¼ ÁöÇâÀûÀÎ ¹æ¹ý°ú´Â ¾î¿ï¸®Áö ¾Ê´Â´Ù.
¨è °³¼ö¸¦ ¸ÕÀú Á¶»çÇÏ°í °³º° ¿ä¼Ò¸¦ ±¸ÇÏ´Â ¹æ¹ýÀÌ Àִµ¥ DragQueryFile ÇÔ¼ö°¡ ÀÌ ¹æ¹ýÀ» »ç¿ëÇÏ´Â ´ëÇ¥ÀûÀÎ ¿¹ÀÌ´Ù. »ç¿ëÇϱâ´Â °£´ÜÇÏÁö¸¸ ¼Óµµ´Â ´À¸®¸ç ÀÓÀÇ Á¢±ÙÀÌ °¡´ÉÇؾ߸¸ ÀÌ ¹æ¹ýÀ» ¾µ ¼ö ÀÖ´Ù.
¨é °³¼ö¸¦ ¸ÕÀú Á¶»çÇÑ ÈÄ ÀÌ °³¼ö¸¸ÅÀÇ ¹è¿À» ÇÒ´çÇÏ¿© Æ÷ÀÎÅ͸¦ Àü´ÞÇÏ¸é ¹è¿¿¡ ±¸ÇÏ´Â ¸ðµç ÀڷḦ ÇѲ¨¹ø¿¡ º¹»çÇÑ´Ù. °¡Àå °£ÆíÇÏ¸ç ¶ÇÇÑ °¡Àå ºü¸¥ ¹æ¹ýÀ̱⵵ ÇÏÁö¸¸ ¹°¸®ÀûÀÎ ¸Þ¸ð¸®¸¦ ¸¹ÀÌ ¼Ò¸ðÇÑ´Ù´Â °ÍÀÌ ´ÜÁ¡ÀÌ´Ù.
GDI+´Â ÁÖ·Î ¼¼ ¹ø° ¹æ¹ýÀ» »ç¿ëÇϴµ¥ ¸Þ¸ð¸®°¡ °ú°Åº¸´Ù Àú·ÅÇØÁ³±â ¶§¹®¿¡ ¸ðµç Á¤º¸¸¦ ÇѲ¨¹ø¿¡ Á¶»çÇصµ º° ºÎ´ãÀÌ µÇÁö ¾Ê±â ¶§¹®ÀÌ´Ù. À̹ÌÁöÀÇ ÇÁ·ÎÆÛƼ ¸ñ·ÏÀ» ±¸ÇÒ ¶§´Â Image Ŭ·¡½ºÀÇ ´ÙÀ½ µÎ ¸â¹ö ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.
Status GetPropertySize(UINT *totalBufferSize, UINT *numProperties);
Status GetAllPropertyItems(UINT totalBufferSize, UINT numProperties, PropertyItem *allItems);
ÇÁ·ÎÆÛƼÀÇ °³¼ö°¡ °¡º¯ÀûÀ̱⠶§¹®¿¡ ¿ì¼± GetPropertySize ÇÔ¼ö·Î ÃÑ Å©±â¿Í °³¼ö¸¦ Á¶»çÇØ¾ß ÇÑ´Ù. ±×¸®°í Á¶»çµÈ Å©±â¸¸Å ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ¿© ±× ¹øÁö¸¦ GetAllPropertyItems ÇÔ¼ö·Î Àü´ÞÇϸé À̹ÌÁö ÇÁ·ÎÆÛƼÀÇ ¹è¿À» ¸Þ¸ð¸®¿¡ ä¿öÁØ´Ù. À̹ÌÁö ÇÁ·ÎÆÛƼ´Â PropertyItem Ŭ·¡½º·Î ³ªÅ¸³»´Âµ¥ ÀÌ Å¬·¡½º´Â ´ÙÀ½ 4°³ÀÇ ¸â¹ö¸¦ °¡Áø´Ù.
¸â¹ö |
¼³¸í |
id |
¾î¶² Á¾·ùÀÇ ÇÁ·ÎÆÛƼÀΰ¡¸¦ ³ªÅ¸³½´Ù. Àåºñ, ¸ðµ¨, ÇØ»óµµ, Á¦ÀÛÀÚ µîµîÀÇ Á¤º¸¿¡ ´ëÇØ °íÀ¯ÀÇ 16Áø ID°¡ ºÎ¿©µÇ¾î ÀÖ´Ù. ÀÌ IDÀÇ ¸ñ·ÏÀº ³Ê¹« ±æ¾î¼ µµ¿ò¸»¿¡µµ Á¤¸®µÇ¾î ÀÖÁö ¾ÊÀ¸¸ç GdiPlusimaging.h Çì´õ ÆÄÀÏÀ» ¿¾î¼ Á÷Á¢ È®ÀÎÇØ º¸¾Æ¾ß ÇÑ´Ù. |
length |
ÇÁ·ÎÆÛƼÀÇ ±æÀ̸¦ ¹ÙÀÌÆ® ´ÜÀ§·Î ³ªÅ¸³½´Ù. ¹®ÀÚ¿ÀÏ °æ¿ì °¡º¯ ±æÀ̸¦ °¡Áú ¼ö ÀÖ´Ù. |
type |
ÇÁ·ÎÆÛƼÀÇ Å¸ÀÔÀ» ³ªÅ¸³»´Â Á¤¼ö°ªÀÌ´Ù. 1À̸é BYTE, 2¸é ASCII(¹®ÀÚ¿), 3À̸é short, 4¸é long µîÀ¸·Î Á¤ÀǵȴÙ. ÃÑ 10°¡Áö Á¾·ùÀÇ Å¸ÀÔÀ» Á¤ÀÇÇϴµ¥ ÁÖ·Î 2¹ø ¾Æ´Ï¸é 3,4¹øÀÎ °æ¿ì°¡ ¸¹´Ù. ÀÌ Å¸ÀÔ Á¤º¸·ÎºÎÅÍ ½ÇÁ¦ °ªÀ» Àд ¹æ¹ýÀÌ ´Þ¶óÁø´Ù. |
value |
ÇÁ·ÎÆÛƼÀÇ ½ÇÁ¦°ªÀ» °¡Áö´Â void *Çü ¸â¹öÀÌ´Ù. ÀÓÀÇÀÇ Å¸ÀÔÀ» °¡¸®Å°¹Ç·Î ÀÐÀ» ¶§ ¿øÇϴ ŸÀÔÀ¸·Î ij½ºÆÃÇØ¾ß ÇÑ´Ù. ŸÀÔ°ú ±æÀÌ Á¤º¸´ë·Î ÀÌ ¹è¿À» ÀÐÀ¸¸é ¿øÇÏ´Â °ªÀ» Á¶»çÇÒ ¼ö ÀÖ´Ù. |
´ÙÀ½ ÄÚµå´Â "³ëÀ».jpg" ÆÄÀÏÀÇ ÇÁ·ÎÆÛƼ¸¦ ´ëÃæ Á¶»çÇØ º» °ÍÀÌ´Ù. µð¹ö±ëÇغ¸¸é 40¿©°³ÀÇ ÇÁ·ÎÆÛƼµéÀÌ Æ÷ÇԵǾî Àִµ¥ ´ëºÎºÐÀº »çÁø¿¡ ´ëÇÑ Àü¹®ÀûÀÎ Áö½ÄÀÌ ÀÖ¾î¾ß¸¸ ÀÌÇØÇÒ ¼ö ÀÖ´Â °ÍµéÀ̶ó Á÷°üÀûÀ¸·Î ÀÌÇØÇϱ⠽¬¿î Á¤º¸¸¸ Ãâ·ÂÇØ º¸¾Ò´Ù.
Image I(L"³ëÀ».jpg");
UINT size,count,i,y=0;
PropertyItem *arPro;
TCHAR str[1024];
I.GetPropertySize(&size,&count);
arPro=(PropertyItem *)malloc(size);
I.GetAllPropertyItems(size,count,arPro);
for (i=0;i<count;i++) {
switch (arPro[i].id) {
case PropertyTagImageTitle:
wsprintf(str,TEXT("Á¦¸ñ : %S"),(TCHAR *)arPro[i].value);
break;
case PropertyTagImageDescription:
wsprintf(str,TEXT("¼³¸í : %S"),(TCHAR *)arPro[i].value);
break;
case PropertyTagCopyright:
wsprintf(str,TEXT("ÀúÀÛ±Ç : %S"),(TCHAR *)arPro[i].value);
break;
case PropertyTagEquipMake:
wsprintf(str,TEXT("Àåºñ : %S"),(TCHAR *)arPro[i].value);
break;
case PropertyTagEquipModel:
wsprintf(str,TEXT("¸ðµ¨ : %S"),(TCHAR *)arPro[i].value);
break;
case PropertyTagXResolution:
wsprintf(str,TEXT("°¡·Î ÇØ»óµµ : %d"),*(LONG *)arPro[i].value);
break;
case PropertyTagYResolution:
wsprintf(str,TEXT("¼¼·Î ÇØ»óµµ : %d"),*(LONG *)arPro[i].value);
break;
case PropertyTagSoftwareUsed:
wsprintf(str,TEXT("»ç¿ëÇÑ ¼ÒÇÁÆ®¿þ¾î : %S"),(TCHAR *)arPro[i].value);
break;
case PropertyTagDateTime:
wsprintf(str,TEXT("³¯Â¥ : %S"),(TCHAR *)arPro[i].value);
break;
default:
continue;
}
TextOut(hdc,0,y*20,str,lstrlen(str));
y++;
}
free(arPro);
id°ªÀ¸·Î ÇÁ·ÎÆÛƼ Á¾·ùº°·Î ºÐ±âÇÏ°í value°ªÀ» ÀÐ¾î ¹®ÀÚ¿·Î Á¶¸³ÇÏ´Â ´Ü¼øÇÑ Ãâ·Â¹®ÀÏ »ÓÀÌ´Ù. ´Ü, ¿©±â¼ ÁÖÀÇÇÒ Á¡Àº À̹ÌÁö ÇÁ·ÎÆÛƼ¿¡ ÀúÀåµÈ ¹®ÀÚ¿Àº ANSIÀ̹ǷΠÀ¯´ÏÄÚµå·Î ¹Ù²Û ÈÄ Ãâ·ÂÇØ¾ß Á¦´ë·Î º¸Àδٴ Á¡ÀÌ´Ù. µðÁöÅÐ Ä«¸Þ¶ó°¡ À¯´ÏÄڵ带 ÀνÄÇϱ⸦ ¹Ù¶ó´Â °ÍÀº ¾ÆÁ÷±îÁö´Â ½Ã±â »óÁ¶ÀÎ µí ÇÏ´Ù. wsprintf·Î ANSI ¹®ÀÚ¿À» Á¶¸³ÇÒ ¶§´Â ´ë¹®ÀÚÀÇ %S ¼½ÄÀ» »ç¿ëÇÏ¸é ¾Ë¾Æ¼ º¯È¯ÇϹǷΠÆí¸®ÇÏ´Ù. ½ÇÇà °á°ú´Â ´ÙÀ½°ú °°´Ù.
À̹ÌÁö¿¡ Æ÷ÇÔµÈ ¸ðµç ÇÁ·ÎÆÛƼ¸¦ ŸÀÔ¿¡ ¸Â°Ô Á¦´ë·Î Ãâ·ÂÇÏ¸é »ó´çÈ÷ ±ä Äڵ尡 ÇÊ¿äÇÒ °ÍÀÌ´Ù. ±×¸¸Å ÇÁ·ÎÆÛƼÀÇ Á¾·ù°¡ ´Ù¾çÇϱ⠶§¹®ÀÌ´Ù. À̹ÌÁöÀÇ ÇÁ·ÎÆÛƼ°ªÀ» º¯°æÇϰųª Ãß°¡ÇÏ°í ½Í´Ù¸é ´ÙÀ½ ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.
Status SetPropertyItem(const PropertyItem* item);
±â·ÏÇÏ°í ½ÍÀº Á¤º¸¸¦ PropertyItem °´Ã¼¿¡ ÀÛ¼ºÇÑ ÈÄ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇϸé À̹ÌÁö¿¡ ÇÁ·ÎÆÛƼ Á¤º¸°¡ ¼öÁ¤ ¶Ç´Â Ãß°¡µÈ´Ù.
GDI+´Â ¿©·¯ °¡Áö ¸é¿¡¼ È°¿ë¼ºÀÌ ³ôÁö¸¸ ±× Áß¿¡ °¡Àå ¸Å·ÂÀûÀÎ ±â´ÉÀº ´Ù¾çÇÑ Æ÷¸ËÀÇ À̹ÌÁö¸¦ º°µµÀÇ ¿ÜºÎ ¶óÀ̺귯¸® ¾øÀ̵µ ÀÐ°í ¾µ ¼ö ÀÖ´Ù´Â Á¡ÀÌ´Ù. ¿©±â¼´Â Áö±Ý±îÁö ¹è¿î GDI+ÀÇ À̹ÌÁö °ü·Ã ±â´ÉÀ» ½Ç½ÀÇØ º¸±â À§ÇØ °£´ÜÇÑ À̹ÌÁö ºä¾î ÇÁ·Î±×·¥À» ¸¸µé¾î º¸±â·Î ÇÑ´Ù. GrimBoa ÇÁ·ÎÁ§Æ®´Â ƯÁ¤ µð·ºÅ丮¿¡ ÀÖ´Â À̹ÌÁö¸¦ ¼ø¼´ë·Î º¸¿© ÁÖ´Â °£´ÜÇÑ À̹ÌÁö ºä¾î ÇÁ·Î±×·¥ÀÌ´Ù.
ÀÌ °Á¸¦ ´Ù½Ã ¾²¸é¼ ¸ðµç ¿¹Á¦¸¦ VS 2008¿ëÀ¸·Î ´Ù½Ã ÀÛ¼ºÇÏ¿´À¸¸ç º¯ÈµÈ ȯ°æ¿¡ ¸Â°Ô À¯´ÏÄÚµå ÇÁ·ÎÁ§Æ®·Î ¸¸µé¾ú´Ù. ÀÌ ¿¹Á¦µµ À¯´ÏÄÚµå·Î ´Ù½Ã ±ò²ûÇÏ°Ô ¸¸µé·Á°í ÇßÀ¸³ª ¹®ÀÚ¿ÀÌ ³Ê¹« ¸¹°í ±ºµ¥ ±ºµ¥ ¹®ÀÚ¿ º¯È¯ ·çƾ±îÁö ÀÖ¾î¼ µµÀúÈ÷ ªÀº ½Ã°£¾È¿¡ À¯´ÏÄÚµå·Î º¯È¯ÇÒ ¼ö°¡ ¾ø¾ú´Ù. ±×·¡¼ ºÒ°¡ÇÇÇÏ°Ô ÀÌ ¿¹Á¦´Â ÀÌÀü ¿¹Á¦¸¦ »õ·Î ¸¸µéÁö ¸øÇßÀ¸¸ç ¿©ÀüÈ÷ ANSI ÇÁ·ÎÁ§Æ®ÀÌ´Ù. ¼Ò½º°¡ ¹«Ã´ ±æ±â ¶§¹®¿¡ ¸®½ºÆ®´Â »ý·«ÇÑ´Ù.
¿¹ Á¦ : GrimBoa |
========== ¼Ò½º »ý·« ==========
ÇÁ·Î±×·¥À» ½ÇÇàÇÑ ÈÄ ÆÄÀÏ/µð·ºÅ丮 ¼±Åà ¸Þ´º¸¦ ÅëÇØ ±×¸² ÆÄÀÏÀÌ ÀÖ´Â Æú´õ¸¦ ÁöÁ¤Çϸé ÀÌ Æú´õÀÇ Ã¹ ¹ø° ±×¸²ÀÌ È¸éÀ¸·Î Ãâ·ÂµÈ´Ù. ±×¸®°í PgUp, PgDnÅ°³ª ¸¶¿ì½º ÈÙ·Î ¾Õ µÚ·Î À̵¿ÇÏ¸ç ±×¸²À» °¨»óÇÒ ¼ö ÀÖ´Ù. À̹ÌÁö°¡ ⺸´Ù Ŭ °æ¿ì â¿¡ ¸ÂÃß±â, Àüü ȸé, ¸ñ·Ï ¼øȯ, ½½¶óÀÌ´õ ¼î µîÀÇ ±âº»ÀûÀÎ ±â´ÉÀÌ Á¦°øµÈ´Ù.
GDI+°¡ À̹ÌÁö¿Í °ü·ÃµÈ ±â´ÉÀ» ¸ðµÎ Á¦°øÇϹǷΠ¸ÞÀÎ ¸ðµâÀÇ ±æÀÌ´Â ±×´ÙÁö ±æÁö ¾Ê´Ù. ´Ù¸¸ ¹é±×¶ó¿îµå ÀÛ¾÷À» À§ÇØ ½º·¹µå¸¦ »ç¿ëÇϱ⠶§¹®¿¡ ¾à°£ ³À̵µ°¡ ³ô±â´Â ÇÏ´Ù. ÀÌ ÇÁ·Î±×·¥Àº µÎ °³ÀÇ À©µµ¿ì¸¦ °¡Áö´Âµ¥ ¸ÞÀÎ À©µµ¿ì´Â Àü¹ÝÀûÀÎ ÇÁ·Î±×·¥ÀÇ ±â´ÉÀ» ó¸®ÇÏ¸ç ¾Ù¹ü Â÷Àϵå À©µµ¿ì´Â ±×¸²À» º¸¿©Áֱ⸸ ÇÑ´Ù. ¸ÞÀÎ À©µµ¿ì´Â ½ÇÁ¦ ÀÛ¾÷À» ÇÏÁö ¸»¾Æ¾ß Çϸç À̹ÌÁö¸¦ Ãâ·ÂÇÏ´Â À©µµ¿ì¸¦ µû·Î ºÐ¸®ÇØ µÎ¾î¾ß ÀÌÈÄ ÇÁ·Î±×·¥ÀÇ È®À强ÀÌ ÁÁ¾ÆÁø´Ù.
ÀÌ ÇÁ·Î±×·¥Àº ÁöÁ¤ÇÑ Æú´õÀÇ ¸ðµç À̹ÌÁö¸¦ º¸¿© ÁֹǷΠ¸ÕÀú À̹ÌÁöÀÇ ¸ñ·ÏÀ» Á¶»çÇØ¾ß ÇÑ´Ù. ÇÑ µð·ºÅ丮¿¡ Æ÷ÇԵǴ À̹ÌÁöÀÇ °³¼ö¿¡´Â »óÇÑ°ªÀÌ ¾ø±â ¶§¹®¿¡ À̹ÌÁö ¸ñ·ÏÀº µ¿ÀûÀ¸·Î °ü¸®ÇÑ´Ù. ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÈ ±¸Á¶Ã¼¸¦ Á¤ÀÇÇÏ°í ÀÌ ±¸Á¶Ã¼ ŸÀÔÀÇ Æ÷ÀÎÅÍ·Î µ¿Àû ¹è¿À» ÀÛ¼ºÇÏ°í ÀÖ´Ù.
struct tag_File {
TCHAR Name[MAX_PATH];
int Size;
int Order;
FILETIME time;
BOOL bMark;
};
Size¿Í Order ¸â¹ö´Â ÆÄÀÏ Å©±â¿Í ¹ß°ß ¼ø¼¸¦ ±â·ÏÇÑ´Ù. À̹ÌÁö¸¦ º¸¿©ÁÖ´Â ¼ø¼´Â µðÆúÆ®·Î ¹ß°ßµÈ ¼ø¼´ë·ÎÀÌÁö¸¸ Å©±â¼øÀ̳ª À̸§¼ø, ½Ã°£¼øÀ¸·Î Á¤·ÄÇÒ ¶§ ÀÌ ¸â¹öµéÀÌ »ç¿ëµÈ´Ù. bMark´Â ÀÏ°ýÀûÀÎ ÆÄÀÏ »èÁ¦¸¦ À§ÇØ »èÁ¦ ´ë»ó ÆÄÀÏÀÓÀ» ±â¾ïÇÏ´Â ¸â¹öÀÌ´Ù. ÆÄÀÏÀÇ ¸ñ·ÏÀ» ÀÛ¼ºÇÏ´Â ½ÃÁ¡Àº µÎ ±ºµ¥°¡ Àִµ¥ ù ¹ø°´Â ¸Þ´º¿¡¼ ¸í½ÃÀûÀÎ ¸í·ÉÀ» ³»·ÈÀ» ¶§ÀÌ°í µÎ ¹ø°´Â Ž»ö±â¿¡¼ ÆÄÀÏÀ» µå·¡±×Çؼ ¶³¾î¶ß·ÈÀ» ¶§(WM_DROPFILES)ÀÌ´Ù.
µÎ °æ¿ì ¸ðµÎ ¼±ÅÃÇÑ µð·ºÅ丮ÀÇ ÆÄÀÏ ¸ñ·ÏÀ» Á¶»çÇÏ°í ±×¸² º¸¿© Áֱ⸦ ½ÃÀÛÇ쵂 ¸Þ´º·ÎºÎÅÍÀÇ ¸í·ÉÀÏ ¶§´Â ù ¹ø° ÆÄÀϺÎÅÍ Ãâ·ÂÇÏ¸é µÇ°í ÆÄÀÏÀ» µå·¡±×ÇßÀ» ¶§´Â µå·¡±×ÇÑ ÆÄÀϺÎÅÍ Ãâ·ÂÇØ¾ß ÇÑ´Ù. ÆÄÀÏÀÇ ¸ñ·ÏÀ» ÀÛ¼ºÇÏ´Â ÀÛ¾÷Àº MakeList°¡ ´ã´çÇÑ´Ù. ÀÌ ÇÔ¼ö´Â FileList ¹è¿À» ÃÖÃÊ 1000ÀÇ Å©±â·Î ÇÒ´çÇÏ°í FindInFiles ÇÔ¼ö¸¦ È£ÃâÇÏ¿© °Ë»öÀ» ½ÃÀÛÇÑ´Ù.
FindInFiles À¯Æ¿¸®Æ¼ ÇÔ¼ö´Â ÁöÁ¤ÇÑ Æú´õÀÇ Æ¯Á¤ ÆÐÅÏ ÆÄÀÏÀ» °Ë»öÇØ Äݹé ÇÔ¼ö¸¦ È£ÃâÇϴµ¥ ¼ºê µð·ºÅ丮 °Ë»ö, º¹ÀâÇÑ ÆÐÅÏ Ã³¸®, ¼ûÀº ÆÄÀÏ Ã³¸® µîÀÇ ±â´ÉÀ» °¡Áö°í ÀÖ´Ù. ÆÐÅÏÀ¸·Î GDI+°¡ Áö¿øÇÏ´Â ¸ðµç ·¡½ºÅÍ À̹ÌÁö ÆÄÀÏÀ» Àü´ÞÇß´Ù. ÀÌ ÇÔ¼ö¿¡ ÀÇÇØ À̹ÌÁö ÆÄÀÏÀÌ ¹ß°ßµÉ ¶§¸¶´Ù OnFindImage Äݹé ÇÔ¼ö°¡ È£ÃâµÇ¸ç ÀÌ ÇÔ¼ö¿¡¼ °Ë»öµÈ ÆÄÀÏÀÇ À̸§À» FileList ¹è¿¿¡ Â÷°î Â÷°î ¸ð¾ÆµÐ´Ù. ¹°·Ð µ¿Àû ¹è¿ÀÌ °¡µæÂû °æ¿ì¸¦ ´ëºñÇؼ ÀçÇÒ´ç 󸮵µ ÇÏ°í ÀÖ´Ù.
°Ë»öÀÌ ³¡³ª¸é FileList ¹è¿¿¡´Â À̹ÌÁö ÆÄÀÏÀÇ À̸§ÀÌ ¹ß°ßµÈ ¼ø¼´ë·Î ÀúÀåµÇ¾î ÀÖÀ» °ÍÀ̸ç ListNum º¯¼ö¿¡´Â ¹ß°ßµÈ À̹ÌÁö ÆÄÀÏÀÇ °³¼ö°¡ ±â·ÏµÈ´Ù. ÀÌÈÄ ¸ñ·ÏÀÇ ¼ø¼´ë·Î ¾Ù¹ü¿¡ À̹ÌÁö¸¦ Ãâ·ÂÇÏ¸é µÈ´Ù.
¸ñ·Ï¿¡ ÀÖ´Â ÆÄÀÏÀ» ¼ø¼´ë·Î Ãâ·ÂÇÏ´Â °ÍÀº ¾ÆÁÖ ½±´Ù. ±×·¯³ª »ç¿ëÀÚÀÇ ¿äûÀÌ ÀÖÀ» ¶§ ´ÙÀ½ À̹ÌÁö¸¦ º¸¿© ÁÖ·Á¸é ½Ã°£ÀÌ ³Ê¹« ¿À·¡ °É¸°´Ù´Â °ÍÀÌ ¹®Á¦´Ù. µðÁöÅÐ Ä«¸Þ¶óÀÇ Çػ󵵰¡ ³ô¾ÆÁ® º¸Åë 2048*1536 Á¤µµ µÇ´Â À̹ÌÁö°¡ ¸¹°í ÀÌ·± À̹ÌÁöµéÀº ¶ÇÇÑ ¾ÐÃàµÇ¾î Àִµ¥´Ù ȸé Å©±â¿¡ ¸Â°Ô Ãà¼Ò±îÁö ÇØ¾ß Çϱ⠶§¹®¿¡ À̹ÌÁö ÇÑ ÀåÀ» ±×¸®´Âµ¥ ¼öÃÊ Á¤µµÀÇ ½Ã°£ÀÌ ÇÊ¿äÇÏ´Ù. »ç¿ëÀÚµéÀº ÂüÀ»¼ºÀÌ ¾ø±â ¶§¹®¿¡ ÀÌ·¸°Ô ¿À·¡ °É·Á¼´Â ºä¾î·Î½áÀÇ °¡Ä¡°¡ ¶³¾îÁø´Ù.
±×·¡¼ ÀÌ ÇÁ·Î±×·¥Àº »ç¿ëÀÚ°¡ ±×¸²À» °¨»óÇÏ´Â µ¿¾È¿¡µµ ºÎÁö·±È÷ ´ÙÀ½ ±×¸²À» ÀÐ¾î µÎ´Â ¹é±×¶ó¿îµå ÀÛ¾÷À» ÇÏ°í Àִµ¥ À̸¦ À§ÇØ ½½·ÔÀ̶ó´Â °³³äÀ» µµÀÔÇß´Ù. ½º·¹µå¿¡°Ô ¾î¶² ÀÛ¾÷À» ÀÏÀÏÀÌ Áö½ÃÇÏ´Â °ÍÀº µ¿±âÈ ¹®Á¦·Î ÀÎÇÏ¿© ¹«Ã´ °ñÄ¡¾Æǵ¥ ½½·ÔÀ» ÅëÇØ ÁÖ ½º·¹µå¿Í ÀÛ¾÷ ½º·¹µåÀÇ Åë½ÅÀ» ´Ü¼øȽÃÅ°´Â °ÍÀÌ´Ù. ½½·ÔÀº ´ÙÀ½°ú °°ÀÌ Á¤ÀÇµÈ ±¸Á¶Ã¼ÀÌ´Ù.
struct tag_Slot {
CachedBitmap *pCB;
int idx;
};
tag_Slot Slot[3];
pCB´Â ij½Ã ºñÆ®¸Ê Æ÷ÀÎÅÍÀ̸ç idx´Â ¸ñ·Ï»óÀÇ À̹ÌÁö ÷ÀÚÀÌ´Ù. ÀÌ·± ±¸Á¶Ã¼¸¦ ¼¼ °³ ¸ð¾Æ Slot ¹è¿À» ¼±¾ðÇߴµ¥ Slot[1]Àº ÁÖ ½º·¹µå°¡ Ãâ·ÂÇÒ À̹ÌÁöÀ̸ç Slot[0], Slot[2]´Â ÀÌÀü, ÀÌÈÄ À̹ÌÁöÀÌ´Ù. ¸ñ·ÏÀÌ ÀÛ¼ºµÈ Á÷ÈÄ SetSlot(0) ÇÔ¼ö´Â ½½·ÔÀ» ´ÙÀ½ »óÅ·ΠÃʱâÈÇÑ´Ù.
idx¿¡ ÀÐÀ» À̹ÌÁöÀÇ Ã·ÀÚ¸¦ ±â·ÏÇϴµ¥ Slot[1]¿¡´Â ù ±×¸²ÀÎ 0¹ø, Slot[2]¿¡´Â ´ÙÀ½ ±×¸²ÀÎ 1¹øÀÌ ±â·ÏµÇ¾î ÀÖ´Ù. ÀÌÀü ±×¸²ÀÎ Slot[0]¿¡´Â º¸¿©ÁÙ ±×¸²ÀÌ ¾øÀ¸¹Ç·Î -1·Î ÃʱâÈÇ쵂 bWrap ¿É¼ÇÀÌ ÄÑÁ® ÀÖÀ¸¸é ¸¶Áö¸· À̹ÌÁö ¹øÈ£¸¦ Àû¾î ÁØ´Ù. pCB ¸â¹ö´Â ¸ðµÎ NULL·Î ÃʱâÈÇÏ°í ÀÌÀü¿¡ ÀÛ¼ºµÇ¾î ÀÖ´ø ij½Ã ºñÆ®¸ÊÀº ¸ðµÎ Æı«ÇÑ´Ù.
ÀÌ »óŸ¦ ¸¸µé¾î ³õÀ¸¸é ¹é±×¶ó¿îµåÀÇ ÀÛ¾÷ ½º·¹µåÀÎ PrepareThread´Â ¼¼ ½½·ÔÀ» Â÷·Ê´ë·Î Á¡°ËÇÏ¿© idx°¡ -1ÀÌ ¾Æ´Ï°í pCB°¡ NULLÀÎ ½½·ÔÀÇ À̹ÌÁö¸¦ ij½Ã ºñÆ®¸Ê¿¡ ÀÛ¼ºÇÑ´Ù. ÁÖ ½º·¹µå´Â ÀÚ½ÅÀÌ ´çÀå ±×·Á¾ß ÇÒ Slot[1].pCB¸¦ ´ë±âÇϴµ¥ µ¿±âÈ ¿ÀºêÁ§Æ®¸¦ ¾²Áö ¾Ê°í ´Ü¼øÇÑ while¹®À¸·Î ÀÌ ¸â¹ö°¡ NULLÀÌ ¾Æ´Ñ »óÅ°¡ µÉ ¶§±îÁö ±â´Ù¸®µµ·Ï Çß´Ù. ´Ü, Sleep(0)¸¦ ½ÇÇàÇÔÀ¸·Î½á Á¶°ÇÀÌ ¸¸Á·µÇÁö ¾ÊÀ» ¶§´Â Áï½Ã ½ÇÇà ½Ã°£À» ¾çº¸ÇÑ´Ù.
À̺¥Æ®°°Àº µ¿±âÈ °´Ã¼¸¦ »ç¿ëÇÒ ¼öµµ ÀÖÁö¸¸ ÀÌ·± °´Ã¼¸¦ »ç¿ëÇÏ·Á¸é ½ÅÈ£, ºñ½ÅÈ£ »óŸ¦ Àß °ü¸®ÇØ¾ß ÇϹǷΠ³í¸®°¡ º¹ÀâÇØÁø´Ù. ÀÌ ÇÁ·Î±×·¥Àº Slot[1].pCB Àü¿ª º¯¼ö ÀÚü¸¦ µ¿±âÈ °´Ã¼·Î »ç¿ëÇϴµ¥ ´ë±âÇÏ´Â ¹æ½ÄÀÌ Á¶±Ý ºñÈ¿À²ÀûÀÌÁö¸¸ Äڵ尡 Á÷°üÀûÀÌ¾î¼ °ü¸®Çϱâ´Â ÈξÀ ´õ ½¬¿öÁø´Ù. ¶§·Î´Â ¹«½ÄÇØ º¸ÀÌ´Â ¹æ¹ýµµ ³ª¸§´ë·Î ¾µ¸¸ÇÏ´Ù.
¾Ù¹ü À©µµ¿ìÀÇ WM_PAINT ó¸® ·çƾÀº Áö±ØÈ÷ °£´ÜÇؼ DrawCachedBitmap ÇÔ¼ö·Î ¹«Á¶°Ç Slot[1].pCB¸¦ ȸéÀ¸·Î Ãâ·ÂÇϱ⸸ ÇÏ¸é µÈ´Ù. ij½Ã ºñÆ®¸ÊÀ» ÀÛ¼ºÇÏ´Â ÀÛ¾÷Àº ½º·¹µå°¡ ´ë½Å ÇÏ°í ÀÖÀ¸¸ç ÁÖ ½º·¹µå´Â ÀÛ¾÷ ½º·¹µå°¡ ±×¸²À» ¿Ï¼ºÇÒ ¶§±îÁö ±â´Ù¸®¹Ç·Î WM_PAINT´Â º°·Î ÇÒ ÀÏÀÌ ¾ø´Ù. ±×¸² Ãâ·Â ÈÄ »èÁ¦ Ç¥½ÃµÈ À̹ÌÁö¿¡ ´ëÇØ ¹ÝÅõ¸íÇÑ »¡°£»öÀ¸·Î XÀÚ¸¦ ±×·Á »èÁ¦ ´ë»óÀÓÀ» Ç¥½ÃÇß´Ù.
ÀÌ ÇÁ·Î±×·¥ÀÌ Ã¤¿ëÇÏ°í ÀÖ´Â ½½·ÔÀÇ °³³äÀº »ç½Ç ¹«Ã´ °£´ÜÇÑ ºÐ¾÷ÀÇ ¿¹¶ó°í ÇÒ ¼ö ÀÖ´Ù. ÁÖ ½º·¹µå´Â ½½·Ô¿¡ ¾î¶² À̹ÌÁö¸¦ º¸¿©Áà¾ß ÇÏ´ÂÁö¿¡ ´ëÇÑ ¿äû »çÇ׸¸ ±â·ÏÇÏ°í ÀÛ¾÷ ½º·¹µå´Â ²÷ÀÓ¾øÀÌ ½½·ÔÀ» °¨½ÃÇÏ¿© ¿äûÀÌ µé¾î¿Â ±×¸²À» ±×¸®±â¸¸ ÇÑ´Ù. ÁÖ ½º·¹µå´Â ¸ñ·Ï»óÀÇ º¯È³ª Ãâ·Â ¹æ¹ý(ȸé Å©±â, ¿É¼Ç)ÀÇ º¯È°¡ ÀÖÀ» ¶§ ½½·Ô¸¸ °ü¸®ÇÏ°í À̹ÌÁö´Â Á÷Á¢ ±×¸®Áö ¾ÊÀ¸¸ç ´Ù¸¸ ÀÛ¾÷ÀÌ ¿Ï·áµÉ ¶§±îÁö Àá½Ã ±â´Ù¸®±â¸¸ ÇÏ¸é µÈ´Ù.
ij½Ã ºñÆ®¸ÊÀ» ¸¸µå´Â PrepareThread ÇÔ¼ö´Â ¹«ÇÑ ·çÇÁ¸¦ µ¹¸ç ²÷ÀÓ¾øÀÌ ½½·ÔÀ» °¨½ÃÇÑ´Ù. ¸¸¾à ¾ÆÁ÷ ÆÄÀÏ ¸ñ·ÏÀÌ ÀÛ¼ºµÇÁö ¾Ê¾Ò´Ù¸é 0.05ÃÊ°£ ½ÇÇàÀ» ¾çº¸ÇÏ¿© CPU¸¦ ³Ê¹« ±«·ÓÈ÷Áö ¾Êµµ·Ï Çß´Ù. ÆÄÀÏ ¸ñ·ÏÀÌ ÀÖ´Ù¸é ÀÌÈĺÎÅÍ ºó ½½·ÔÀ» ã¾Æ PrepareImage ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ij½Ã ºñÆ®¸ÊÀ» ÀÛ¼ºÇÑ´Ù.
PrepareImage ÇÔ¼ö´Â ¸Þ¸ð¸® ºñÆ®¸Ê pBitÀÇ Ç¥¸é¿¡ ½½·ÔÀÇ À̹ÌÁö ÆÄÀÏÀ» ã¾Æ Ãâ·ÂÇ쵂 Ãâ·Â ¿É¼Ç°ú À©µµ¿ìÀÇ Å©±â, À̹ÌÁöÀÇ Å©±â µîÀ» °í·ÁÇÏ¿© À̹ÌÁö¸¦ Áß¾Ó¿¡ Àû´çÇÏ°Ô ±×¸°´Ù. ±×¸®°í ÃÖÁ¾ Ãâ·Â °á°ú¸¦ ij½Ã ºñÆ®¸ÊÀ¸·Î ÀÛ¼ºÇÑ´Ù. ÀÛ¾÷ ½º·¹µå´Â ²÷ÀÓ¾øÀÌ ¹«È¿ÈµÈ ij½Ã ºñÆ®¸ÊÀ» ã¾Æ PrepareImage¸¦ È£ÃâÇϹǷΠÀ̹ÌÁö ÷ÀÚ°¡ ÇÒ´çµÈ ½½·Ô¿¡ ´ëÇؼ´Â Ç×»ó ij½Ã ºñÆ®¸ÊÀ» ¸¸µé°í ÀÖ´Â °ÍÀÌ´Ù.
ÇϳªÀÇ ºñÆ®¸ÊÀ» ÀÛ¼º ¿Ï·áÇßÀ¸¸é ÀÏ´Ü Sleep(0)À¸·Î ½ÇÇà ½Ã°£À» ¾çº¸Çϴµ¥ ÀÌ´Â ÁÖ ½º·¹µå°¡ ¿Ï¼ºµÈ À̹ÌÁö¸¦ ÃÖ´ëÇÑ »¡¸® ±×¸®µµ·Ï Çϱâ À§ÇÑ ¹è·ÁÀÌ´Ù. ¸¸¾à ¿©±â¼ ¾çº¸¸¦ ÇÏÁö ¾Ê°í ij½Ã ºñÆ®¸Ê ÀÛ¼º¿¡ ¸ôµÎÇØ ¹ö¸®¸é ÁÖ ½º·¹µåÀÇ ¹ÝÀÀÀÌ ´Ê¾îÁö¹Ç·Î »ç¿ëÀÚµéÀº À̹ÌÁö¸¦ Á» ´õ ´Ê°Ô º¸°Ô µÉ °ÍÀÌ°í ±×¸¸Å ÇÁ·Î±×·¥ÀÇ ¹ÝÀÀ¼ºÀº ¶³¾îÁú °ÍÀÌ´Ù. °°Àº ÀÌÀ¯·Î ¼¼ ½½·ÔÀ» ÇÑ ¹ø Á¡°ËÇÒ ¶§¸¶´Ù 21¸¸Å ´õ ½¬¾î ÁÖ ½º·¹µå°¡ Á» ´õ ½Ã°£À» ¾µ ¼ö ÀÖµµ·Ï ÇÑ´Ù. ¿©±â¼ 21Àº ÇÑ ÄöÅÒº¸´Ù Á¶±Ý ´õ ±ä ½Ã°£À¸·Î Á¤ÇØÁø °ªÀÌ´Ù.
½½·ÔÀº ÁÖ ½º·¹µå¿Í ÀÛ¾÷ ½º·¹µå°¡ Åë½ÅÀ» ÇÏ´Â ÁÖ¿ä ¼ö´ÜÀÌ´Ù. ±×·¡¼ ÇÑÂÊ¿¡¼ ½½·ÔÀ» ÂüÁ¶ÇÏ°í ÀÖ´Â µ¿¾È ´Ù¸¥ÂÊ¿¡¼´Â ½½·ÔÀ» °Çµå¸®Áö ¸»¾Æ¾ß ÇÑ´Ù. ÀÛ¾÷ ½º·¹µå°¡ 2¹ø ½½·ÔÀÇ À̹ÌÁö°¡ ¹«È¿ÇÏ´Ù´Â °ÍÀ» È®ÀÎÇÏ°í PrepareImage ÇÔ¼ö¸¦ È£ÃâÇߴµ¥ ±× »çÀÌ¿¡ ÁÖ ½º·¹µå°¡ 2¹ø ½½·ÔÀÇ À̹ÌÁö ÷ÀÚ¸¦ -1·Î Áö¿ö ¹ö¸®¸é PrepareImage ÇÔ¼ö´Â ¸ñ·Ï»óÀÇ ¾û¶×ÇÑ Ã·ÀÚ¸¦ ÂüÁ¶ÇÏ°Ô µÉ °ÍÀÌ´Ù. ±×·¡¼ ½½·ÔÀ» ÂüÁ¶ÇÏ´Â ¸ðµç ¹®ÀåµéÀº hMutex¿¡ ÀÇÇØ Ã¶ÀúÇÏ°Ô µ¿±âȵȴÙ.
ÀÛ¾÷ ½º·¹µå°¡ À̹ÌÁö¸¦ ¸¸µé°í ÀÖ´Â µ¿¾È¿¡´Â ÁÖ ½º·¹µå°¡ ½½·ÔÀ» º¯°æÇÒ ¼ö ¾øÀ¸¸ç ÀÛ¾÷ÀÌ ¿Ï·áµÉ ¶§±îÁö ±â´Ù·Á¾ß ÇÑ´Ù. ¸¶Âù°¡Áö·Î ÁÖ ½º·¹µå°¡ ½½·ÔÀ» Á¶ÀÛÇÏ°í ÀÖ´Â ÁßÀ̶ó¸é ÀÛ¾÷ ½º·¹µå°¡ ½½·ÔÀ» ÂüÁ¶Çؼ´Â ¾ÈµÇ¸ç ±×·² ÇÊ¿äµµ ¾ø´Ù. Àá½Ã ÈÄ ½½·Ô Á¤º¸°¡ ¹«È¿ÈµÉ ¿¹Á¤À̹ǷΠÀÛ¾÷ ½º·¹µå´Â ÁÖ ½º·¹µå°¡ ½½·Ô¿¡ Á¤º¸¸¦ ¿ÏÀüÈ÷ ½á ³ÖÀ» ¶§±îÁö ´ë±âÇØ¾ß ÇÑ´Ù.
»ç¿ëÀÚ°¡ 3¹ø À̹ÌÁö¸¦ º¸°í ÀÖ´Â »óÅ¿¡¼ PgDnÀ¸·Î ´ÙÀ½ À̹ÌÁö·Î À̵¿ÇÑ´Ù°í ÇØ º¸ÀÚ. PgDnÀÌ ´·¯Áö¸é MovePicture ÇÔ¼ö°¡ È£ÃâµÇ´Âµ¥ À̶§ÀÇ ½½·Ô º¯È´Â ´ÙÀ½°ú °°À» °ÍÀÌ´Ù.
»ç¿ëÀÚ°¡ 3¹ø À̹ÌÁö¸¦ °¨»óÇÏ´Â µ¿¾È¿¡ ÀÛ¾÷ ½º·¹µå´Â ÀÌ¹Ì Slot[2]ÀÇ 4¹ø À̹ÌÁö¿¡ ´ëÇØ Ä³½Ã ºñÆ®¸ÊÀ» ¸¸µé¾î ³õ¾ÒÀ» °ÍÀÌ´Ù. ±×·¡¼ ½½·ÔÀ» ÇÑľ¿ À§·Î ¿Ã¸®±â¸¸ Çϸé Slot[2]°¡ Slot[1]ÀÌ µÇ¾î ÁغñµÈ ±×¸²À» Áï½Ã Ãâ·ÂÇÒ ¼ö ÀÖ´Ù. ±×¸®°í Slot[2]´Â ´ÙÀ½ ±×¸²ÀÎ 5¹ø ±×¸²ÀÇ Ã·ÀÚ°¡ ±â·ÏµÇ¸ç pCB´Â NULL·Î ÃʱâÈµÇ¾î ¾ÆÁ÷ ij½Ã ºñÆ®¸ÊÀÌ ¸¸µé¾îÁöÁö ¾Ê¾ÒÀ½À» ±â·ÏÇÑ´Ù.
PgDn¿¡¼ ÀÌ·¸°Ô ½½·Ô¸¸ Á¶ÀÛÇØ ³õÀ¸¸é ÀÛ¾÷ ½º·¹µå°¡ ÷ÀÚ´Â Àִµ¥ ij½Ã ºñÆ®¸ÊÀÌ ¾ø´Â ½½·ÔÀ» ãÀ» °ÍÀÌ°í »ç¿ëÀÚ°¡ 4¹ø À̹ÌÁö¸¦ °¨»óÇÏ´Â µ¿¾È ¹é±×¶ó¿îµå¿¡¼ 5¹ø À̹ÌÁöÀÇ Ä³½Ã ºñÆ®¸ÊÀ» ¿½ÉÈ÷ ÀÛ¼ºÇÑ´Ù. ´Ù½Ã »ç¿ëÀÚ°¡ PgDnÀ» ´©¸£¸é À̹ø¿¡´Â ¿Ï¼ºµÈ 5¹ø À̹ÌÁö°¡ Slot[1]·Î ¿Ã¶ó¿À°í Slot[2]¿¡´Â 6¹ø À̹ÌÁö¿¡ ´ëÇÑ Ä³½Ã ºñÆ®¸Ê ÀÛ¼º ¿äûÀÌ ±â·ÏµÉ °ÍÀÌ´Ù. ¹Ý´ë·Î ¸¸¾à PgUpÀ» ´©¸£¸é À̶§´Â ½½·ÔÀÌ ¾Æ·¡ÂÊÀ¸·Î ¿òÁ÷¿©¼ ¾Õ¿¡ ÀÌ¹Ì ÀÛ¼ºÇß´ø ij½Ã ºñÆ®¸ÊÀ» ´Ù½Ã ÀçÈ°¿ëÇÏ°Ô µÉ °ÍÀÌ´Ù.
ÀÌ·± ½ÄÀ¸·Î À̹ÌÁö¸¦ À̵¿ÇÒ ¶§´Â ½½·Ô¸¸ ȸÀü½ÃÄÑ ÀÛ¾÷ ½º·¹µå°¡ ÀÌ¹Ì ¸¸µé¾î ³õÀº À̹ÌÁö¸¦ ¾²±â¸¸ ÇÑ´Ù. »ç¿ëÀÚÀÇ ¼Õµ¿ÀÛº¸´Ù ½º·¹µå°¡ ´õ ºü¸£±â¸¸ ÇÏ´Ù¸é »ç¿ëÀÚ´Â Ç×»ó ÁغñµÈ À̹ÌÁö¸¸ º¸°Ô µÉ °ÍÀÌ´Ù. ¸¸¾à ¾ÆÁ÷ ´ÙÀ½ À̹ÌÁö°¡ ÁغñµÇÁö ¾ÊÀº »óȲ¿¡¼ »ç¿ëÀÚ°¡ PgDnÀ» ´©¸£¸é ¾î¶»°Ô µÉ±î? À̶§´Â ¾î¿ ¼ö ¾øÀÌ ÁÖ ½º·¹µå°¡ ÀÛ¾÷ ½º·¹µå¸¦ ±â´Ù¸®´Â ¼ö¹Û¿¡ ¾ø´Ù.
PrepareImage ÇÔ¼ö¿¡¼ ¸¸µå´Â ij½Ã À̹ÌÁö´Â ¾Ù¹ü À©µµ¿ìÀÇ ÀÛ¾÷ ¿µ¿ª°ú ¶È°°Àº Å©±â¸¦ °¡Áö°í ÀÖÀ¸¸ç bFitWindow ¿É¼Ç¿¡ µû¶ó À̹ÌÁöÀÇ Å©±â°¡ ´Þ¶óÁø´Ù. ÀÌ·± ¿É¼ÇÀ̳ª À©µµ¿ìÀÇ Å©±â°¡ ¹Ù²î¸é À̹ÌÁöÀÇ À̵¿ÀÌ ¾ø´õ¶óµµ ij½Ã ºñÆ®¸ÊÀ» ¿ÏÀüÈ÷ ´Ù½Ã ¸¸µé¾î¾ß Çϴµ¥ ÀÌ ÀÛ¾÷À» ÇÏ´Â ÇÔ¼ö°¡ ResetCache ÇÔ¼öÀÌ´Ù.
ResetCache´Â ¸ðµç ½½·ÔÀÇ pCB °´Ã¼¸¦ »èÁ¦ÇÏ°í NULL·Î ¸¸µç´Ù. ±×·¯¸é ÀÛ¾÷ ½º·¹µå°¡ Áï½Ã ÀÌ »ç½ÇÀ» ´«Ä¡Ã¤°í º¯°æµÈ ¿É¼ÇÀ̳ª À©µµ¿ì Å©±â¿¡ ¸Â°Ô ij½Ã ºñÆ®¸ÊÀ» ´Ù½Ã ÀÛ¼ºÇÒ °ÍÀÌ´Ù. ResetCache ÇÔ¼ö´Â Slot[1]ÀÇ Ä³½Ã ºñÆ®¸ÊÀÌ ¿Ï¼ºµÇ´Â µ¿¾È Àá½Ã ´ë±âÇÏ´Â ¿ªÇÒµµ ÇϹǷΠÀÌ ÇÔ¼ö¸¸ È£ÃâÇÏ¸é ¿É¼Ç¿¡ ¸Â°Ô ±×¸²ÀÌ Á¶Á¤µÇ¾î ȸ鿡 Ãâ·ÂµÉ °ÍÀÌ´Ù.
ResetCache ÇÔ¼ö´Â bFitWindow ¿É¼ÇÀÌ º¯°æµÉ ¶§, ±×¸®°í ¾Ù¹ü À©µµ¿ìÀÇ Å©±â°¡ ¹Ù²ð ¶§ È£ÃâµÈ´Ù. Àüü È¸é ¸ðµå·Î ÀüȯÇÒ ¶§´Â ¾Ù¹ü À©µµ¿ìÀÇ WM_SIZE°¡ È£ÃâµÇ¹Ç·Î µû·Î ResetCache ÇÔ¼ö¸¦ È£ÃâÇÒ ÇÊ¿ä°¡ ¾ø´Ù.
±×¸²º¸¾Æ´Â ±×¸² º¸±â ¿Ü¿¡µµ ¸î °¡Áö ÆíÀÇ ±â´ÉÀ» °¡Áö°í ÀÖ´Ù. »óŶõ¿¡ ±×¸²ÀÇ ÃÑ ¼ö, ±×¸²ÀÇ Å©±â¿Í »ö»ó µîÀ» Ãâ·ÂÇÏ°í ¸¶À½¿¡ ¾Èµå´Â ±×¸²À» »èÁ¦ÇÒ ¼ö ÀÖÀ¸¸ç »èÁ¦ Ç¥½Ã¸¸ ÇÑ ÈÄ ÀÏ°ý »èÁ¦ÇÏ´Â ±â´Éµµ Á¦°øµÈ´Ù. ¶ÇÇÑ °£´ÜÇÏÁö¸¸ ¸î °¡Áö º¯°æ °¡´ÉÇÑ ¿É¼Çµµ °¡Áö°í ÀÖ´Ù.
¼³Á¤µÈ ¿É¼ÇµéÀº ·¹Áö½ºÆ®¸®¿¡ ¿Ïº®ÇÏ°Ô ÀúÀåµÇ¾î ´ÙÀ½¹ø ½ÇÇàÇÒ ¶§ ´Ù½Ã Àоî¿Â´Ù. ÀÌ·± ±â´Éµéµµ ¹°·Ð ²Ï ¸¹Àº Äڵ带 ÇÊ¿ä·Î ÇÏÁö¸¸ ÀÌ ½Ç½À¿¡¼ °øºÎÇÏ°íÀÚ ÇÏ´Â ÁÖÁ¦´Â ¾Æ´Ï¹Ç·Î ¼³¸íÀº ÇÏÁö ¾Ê±â·Î ÇÑ´Ù. ¾î·Á¿î ÄÚµåµéÀÌ ¾Æ´Ï¹Ç·Î Á÷Á¢ ºÐ¼®ÇØ º¸¾Æ¶ó.
ÀÌ ¿¹Á¦´Â ªÀº ±æÀÌ·Î °£´ÜÇÑ À̹ÌÁö ºä¾î¸¦ ¸¸µå´Â °ÍÀ» ¸ñÇ¥·Î ÇßÀ¸¹Ç·Î »ó¿ë ÇÁ·Î±×·¥ Á¤µµÀÇ °í±Þ ±â´ÉµéÀº ÀÛ¼ºµÇ¾î ÀÖÁö ¾Ê´Ù. ÈξÀ ´õ ¸¹Àº ±â´ÉÀ» ³ÖÀ» ¼ö ÀÖÁö¸¸ ³Ê¹« ±æ¾îÁö¸é ¿¹Á¦·Î¼ÀÇ °¡Ä¡°¡ ¶³¾îÁö¹Ç·Î ÀÌÂë¿¡¼ ÀÚÀçÇϱâ·Î ÇÑ´Ù. ÀÌ·± ±â´É¿¡ ´ëÇؼ´Â ºÐ¼®ÀÌ ¿Ï·áµÈ ÈÄ Á÷Á¢ ÀÛ¾÷ÇØ º¸±â ¹Ù¶õ´Ù. ´ÙÀ½Àº ¾÷±×·¹À̵åÇØ º¼¸¸ÇÑ ÈùÆ®µéÀÌ´Ù.
¡á À̹ÌÁö¸¦ °Á¦·Î È®´ë ¶Ç´Â Ãà¼ÒÇÏ´Â ÁÜ ±â´ÉÀ» Ãß°¡ÇÑ´Ù.
¡á À̹ÌÁö°¡ ȸ麸´Ù ´õ Ä¿¼ ÀϺθ¸ º¸ÀÏ °æ¿ì Æд×À¸·Î À̹ÌÁö¸¦ À̵¿½ÃŲ´Ù.
¡á Åø¹Ù, µð·ºÅ丮 ¸ñ·Ï µîÀÇ UI¸¦ ºÙÀ̸é ÈξÀ ´õ ¾²±â Æí¸®ÇÏ´Ù.
¡á ¹à±â¿Í ´ëºñ¸¦ Á¶Á¤ÇÏ´Â ¿É¼ÇÀ» ³Ö´Â´Ù. GDI+¿¡ ÀÖ´Â ±â´ÉÀÌ´Ù.
¡á ±×¸²À» ÀÛ°Ô º¸´Â ½æ ³×ÀÏ ±â´ÉÀ» ÀÛ¼ºÇÑ´Ù.
¡á ±×¸²À» ÇÁ¸°ÅÍ·Î ÀμâÇÏ´Â ±â´ÉÀ» ÀÛ¼ºÇÑ´Ù.
¡á º¹»ç, À̵¿, Á¿ì ȸÀü µî °£´ÜÇÑ ÆÄÀÏ °ü¸® ±â´ÉÀ» Á¦°øÇÑ´Ù.
¡á ½º·¹µå ÀÛ¾÷Áß¿¡¶óµµ ÇØ´ç À̹ÌÁö°¡ ÇÊ¿ä¾øÀ¸¸é Ãë¼Ò½ÃÄÑ ¹ÝÀÀ¼ºÀ» ³ôÀδÙ. GDI+ÀÇ ÇÑ°è·Î ÀÎÇØ ±â¼úÀûÀ¸·Î ´Ù¼Ò ¾î·Æ´Ù. DrawImage°¡ Äݹé ÇÔ¼ö¸¦ È£ÃâÇϱâ´Â ÇÏÁö¸¸ ÀÚÁÖ È£ÃâµÇÁö ¾Ê¾Æ Áï½Ã ¹ÝÀÀÇÏÁö ¾Ê´Â ¹®Á¦°¡ ÀÖ´Ù.
¡á ±×¿Ü ÇÊ¿äÇÑ ÃÖÀûȸ¦ ÇÑ´Ù. ÇöÀç ¹öÀüÀº Àüü È¸é ¸ðµå·Î º¯°æÇÒ ¶§ WM_SIZE°¡ µÎ ¹ø Àü´ÞµÇ´Âµ¥ ÀÌ·± ¹®Á¦¸¸ ÇØ°áÇصµ »ó´çÇÑ ¼Óµµ °³¼± È¿°ú°¡ ÀÖ´Ù.
¡á À̹ÌÁö¸¦ ¹ÙÅÁ È¸é º®Áö·Î ¸¸µç´Ù.
GrimBoa´Â 1000ÁÙÀÌ ÈξÀ ³Ñ¾î¼ ¿¹Á¦¶ó±âº¸´Ù´Â À¯Æ¿¸®Æ¼ ÇÁ·Î±×·¥À̶ó°í ÇØ¾ß ÇÒ Á¤µµ´Ù. ÀÌ ÇÁ·Î±×·¥À» ¸¸µå´Âµ¥ ǮŸÀÓÀ¸·Î ´ë·« »çÈê Á¤µµ°¡ °É·È´Âµ¥ ¾ÆÁ÷µµ ±â´É»óÀ¸·Î´Â ¸¹ÀÌ ºÎÁ·ÇÏ´Ù. ¾ÆÁÖ ÀÛÀº ÇÁ·Î±×·¥ÀÓ¿¡µµ ºÒ±¸ÇÏ°í °³¼±ÀÇ ¿©Áö°¡ Á¤¸» ¸¹´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù.
À̹ÌÁö´Â Çȼ¿µéÀÇ »ö»ó Á¤º¸¿¡ ´ëÇÑ ÁýÇÕÀ̹ǷΠÀ̹ÌÁö ÆÄÀÏÀº ´ë´ÜÈ÷ Å©±â°¡ Å©´Ù. 1024*768 Å©±âÀÇ Æ®·çÄ÷¯ À̹ÌÁö¶ó¸é 2M°¡ ÈξÀ ³Ñ±â ¶§¹®¿¡ ÀÌ´ë·Î ÆÄÀÏ·Î ÀúÀåÇÏ¸é µð½ºÅ© °ø°£À» ³Ê¹« ¸¹ÀÌ Â÷ÁöÇÒ »Ó¸¸ ¾Æ´Ï¶ó ³×Æ®¿öÅ©·Î Àü¼ÛÇÏ´Â ½Ã°£µµ ¿À·¡ °É·Á ¹«Ã´ ºÒÆíÇØÁø´Ù. ±×·¡¼ À̹ÌÁö ÆÄÀÏÀº ±âº»ÀûÀ¸·Î ¾ÐÃàÀ» Çϴµ¥ ¾ÐÃàµÈ À̹ÌÁö¸¦ ȸ鿡 Ãâ·ÂÇϱâ À§Çؼ´Â ¾ÐÃàÀ» ¸ÕÀú Ç®¾î¾ß ÇÑ´Ù.
¾ÐÃàµÈ À̹ÌÁö¸¦ Ç®¾î¼ ±×¸²À» ¾ò´Â ÀåÄ¡¸¦ µðÄÚ´õ(Decoder)¶ó°í ÇÏ¸ç ¹Ý´ë·Î ȸ鿡 Ãâ·ÂµÇ¾î ÀÖ´Â ±×¸²À» ¾ÐÃàÇÏ¿© À̹ÌÁö ÆÄÀÏ·Î ¸¸µå´Â ÀåÄ¡¸¦ ÀÎÄÚ´õ(Encoder)¶ó°í ÇÑ´Ù. ÀÌ µÑÀ» ÇÕÃÄ ÄÚµ¦(codec)À̶ó°í ÇÑ´Ù. GDI+´Â ÀÚÁÖ »ç¿ëµÇ´Â ¸î °¡Áö Æ÷¸Ë¿¡ ´ëÇÑ ÀÎÄÚ´õ¿Í µðÄÚ´õ¸¦ ³»ÀåÇÏ°í ÀÖÀ¸¸ç À̹ÌÁö¸¦ Àаųª ÀúÀåÇÒ ¶§ ÀÌ ¸ðµâÀ» È£ÃâÇÏ¿© ¾ÐÃà ¶Ç´Â ÇØÁ¦¸¦ ÇÑ´Ù.
GDI+°¡ Á¦°øÇÏ´Â ÀÎÄÚ´õ¿Í µðÄÚ´õÀÇ ¸ñ·ÏÀ» Á¶»çÇÏ·Á¸é ´ÙÀ½ ÇÔ¼öµéÀ» »ç¿ëÇÑ´Ù. ÀÌ ÇÔ¼öµéÀº ¸ðµÎ Àü¿ª ÇÔ¼öµéÀ̹ǷΠ°´Ã¼¾øÀÌ ¾ðÁ¦µçÁö È£ÃâÇÒ ¼ö ÀÖ´Ù. GDI+´Â ½ºÅ¸Æ® ¾÷, ¼Ë ´Ù¿î ÇÔ¼ö¿Í ´ÙÀ½ 4°¡Áö ÇÔ¼ö µî ÃÑ 6°³ÀÇ Àü¿ª ÇÔ¼ö¸¸ °¡Áø´Ù.
Status GetImageDecodersSize(UINT *numDecoders, UINT *size);
Status GetImageDecoders(UINT numDecoders, UINT size, ImageCodecInfo *decoders);
Status GetImageEncodersSize(UINT *numEncoders, UINT *size);
Status GetImageEncoders(UINT numEncoders, UINT size, ImageCodecInfo *encoders);
ÀÎÄÚ´õ µðÄÚ´õ °¢°¢¿¡ ´ëÇØ ¸ñ·ÏÀÇ Å©±â¸¦ Á¶»çÇÏ´Â ÇÔ¼ö¿Í ¸ñ·ÏÀ» Á¶»çÇÏ´Â ÇÔ¼ö°¡ Á¦°øµÈ´Ù. ¸î °³³ª Á¦°øµÇ´ÂÁö °³¼ö¸¦ ¹Ì¸® ¾Ë ¼ö ¾ø±â ¶§¹®¿¡ Get*Size ÇÔ¼ö·Î ÇÊ¿äÇÑ ¸Þ¸ð¸® ¾ç°ú ÄÚµ¦ÀÇ °³¼ö¸¦ Á¶»çÇÏ¿© ÀÌ Å©±â¸¸Å ¸Þ¸ð¸®¸¦ ÇÒ´çÇÑ ÈÄ Get* ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ¹æ½ÄÀÌ´Ù. ÀÌ ÇÔ¼ö·Î Á¶»çµÇ´Â ÄÚµ¦¿¡ ´ëÇÑ Á¤º¸´Â ImageCodecInfo Ŭ·¡½ºÀÇ ¹è¿ÀÌ´Ù. ÀÌ Å¬·¡½º´Â ´ÙÀ½°ú °°Àº ¸â¹öµéÀ» °¡Áø´Ù.
¸â¹ö |
ŸÀÔ |
¼³¸í |
Clsid |
CLSID |
ÄÚµ¦ÀÇ ID |
FormatID |
GUID |
ÆÄÀÏ Æ÷¸ËÀÇ IDÀ̸ç Gdiplusimaging.h¿¡ Á¤ÀǵǾî ÀÖ´Ù. |
CodecName |
WCHAR * |
ÄÚµ¦ÀÇ À̸§ ¹®ÀÚ¿ÀÌ´Ù. |
Dllname |
WCHAR * |
ÄÚµ¦À» °¡Áö°í ÀÖ´Â DLLÀÇ À̸§À̸ç DLL¿¡ Æ÷ÇÔµÈ ÄÚµ¦ÀÌ ¾Æ´Ò °æ¿ì´Â NULLÀÌ´Ù. |
FormatDescription |
WCHAR * |
ÄÚµ¦¿¡ ´ëÇÑ ¼³¸í |
FileNameExtension |
WHCAR * |
ÄÚµ¦°ú ¿¬°áµÈ ÆÄÀÏÀÇ È®ÀåÀÚÀÌ¸ç ¼¼¹ÌÄÝ·ÐÀ¸·Î ±¸ºÐÇÏ¿© ¿©·¯ °³ÀÇ È®ÀåÀÚ¸¦ µ¿½Ã¿¡ ÁöÁ¤ÇÑ´Ù. |
MimeType |
WHCAR * |
ÄÚµ¦ÀÇ ¸¶ÀÓ Å¸ÀÔÀÌ´Ù. |
Flags |
DWORD |
ImageCodecFlags ¿°ÅÇüÀÇ Á¶ÇÕ Ç÷¡±× |
Version |
DWORD |
ÄÚµ¦ÀÇ ¹öÀü |
SigCount |
DWORD |
ÆÄÀÏ Æ÷¸äÀÌ »ç¿ëÇÏ´Â ½Ã±×³×óÀÇ °³¼ö |
SigSize |
DWORD |
½Ã±×³×óÀÇ Å©±âÀÌ¸ç ¹ÙÀÌÆ® ´ÜÀ§ÀÌ´Ù. |
SigPattern |
BYTE * |
°¢ ½Ã±×³×óÀÇ ÆÐÅÏ |
SigMask |
BYTE * |
°¢ ½Ã±×³×óÀÇ ¸¶½ºÅ© |
ÀÌÁß ÄÚµ¦À» ½Äº°ÇÏ´Â °¡Àå Áß¿äÇÑ Á¤º¸´Â MimeTypeÀÌ´Ù. MIME(Multipurpose Internet Mail Extensions)À̶õ ÀÎÅÍ³Ý ¸ÞÀÏ·Î Àü¼ÛµÇ´Â Á¤º¸ÀÇ ÇüÅ¿¡ ´ëÇÑ Ç¥½ÄÀÌ¸ç º¸³»´Â ÂÊ°ú ¹Þ´Â ÂÊÀÌ Á¤º¸¸¦ Çؼ®ÇÏ´Â ¹æ½ÄÀ» ÁöÁ¤ÇÑ´Ù. ¿¹¸¦ µé¾î º¸³»´Â ÂÊÀÌ text/plain ŸÀÔÀÇ ¸ÞÀÏÀ» º¸³»¸é ¹Þ´Â ÂÊÀº ÀÌ ¹®¼¸¦ ÅؽºÆ®·Î Àоî¾ß ÇÏ°í text/html ŸÀÔÀÇ ¸ÞÀÏÀ» º¸³»¸é À¥ ¹®¼·Î Àоî¾ß ÇÑ´Ù.
MIMEŸÀÔÀº ÀÎÅÍ³Ý ¸ÞÀÏ ÇÁ·ÎÅäÄÝ¿¡ ´ëÇÑ È®Àå ±Ô°ÝÀ¸·Î Á¦¾ÈµÈ °ÍÀÌ¸ç ¸ÞÀÏ¿¡ ÷ºÎµÈ »çÁø, ¿Àµð¿À, ºñµð¿À µîÀÇ ÆÄÀÏ¿¡ ´ëÇÑ Æ÷¸ËÀ» ÁöÁ¤Çϴµ¥ ÇöÀç´Â ¸ÞÀÏ ¿ÜÀÇ ¹®¼¿¡¼µµ Æ÷¸Ë Á¤º¸ Ç¥½Ã¸¦ À§Çؼ MIME ŸÀÔÀ» »ç¿ëÇÑ´Ù. MIME ŸÀÔÀ» ½±°Ô ÀÌÇØÇÏ·Á¸é ÀϹÝÀûÀ¸·Î ÈçÈ÷ ¾ê±âÇÏ´Â Æ÷¸Ë°ú ºñ½ÁÇÑ ¿ë¾î¶ó°í »ý°¢ÇÏ¸é µÈ´Ù. ´ÙÀ½ ¿¹Á¦´Â GDI+°¡ Áö¿øÇÏ´Â ÀÎÄÚ´õ¿Í µðÄÚ´õÀÇ ¸ñ·ÏÀ» Á¶»çÇÏ¿© ȸéÀ¸·Î Ãâ·ÂÇÑ´Ù.
¿¹ Á¦ : EncDec |
void OnPaint(HDC hdc)
{
UINT num,size,i;
ImageCodecInfo *arCod;
TCHAR str[128];
int y=-20;
lstrcpy(str,TEXT("ÀÎÄÚ´õ ¸ñ·Ï"));
TextOut(hdc,0,y+=20,str,lstrlen(str));
GetImageEncodersSize(&num,&size);
arCod=(ImageCodecInfo *)malloc(size);
GetImageEncoders(num,size,arCod);
for (i=0;i<num;i++) {
wsprintf(str,TEXT("MIME=%s, Name=%s, Version=%d,"),
arCod[i].MimeType,arCod[i].CodecName,arCod[i].Version);
TextOut(hdc,0,y+=20,str,lstrlen(str));
}
free(arCod);
y+=20;
lstrcpy(str,TEXT("µðÄÚ´õ ¸ñ·Ï"));
TextOut(hdc,0,y+=20,str,lstrlen(str));
GetImageDecodersSize(&num,&size);
arCod=(ImageCodecInfo *)malloc(size);
GetImageDecoders(num,size,arCod);
for (i=0;i<num;i++) {
wsprintf(str,TEXT("MIME=%s, Name=%s, Version=%d,"),
arCod[i].MimeType,arCod[i].CodecName,arCod[i].Version);
TextOut(hdc,0,y+=20,str,lstrlen(str));
}
free(arCod);
}
Get*Size ÇÔ¼ö·Î ÄÚµ¦ ¹è¿À» ÀúÀåÇϱâ À§ÇÑ ¸Þ¸ð¸® Å©±â¸¦ Á¶»çÇÏ°í ÀÌ Å©±â¸¸Å ¸Þ¸ð¸®¸¦ ÇÒ´çÇÑ ÈÄ Get* ÇÔ¼ö¸¦ È£ÃâÇϸé ÄÚµ¦ÀÇ ¹è¿À» µ¹·ÁÁØ´Ù. ÀÌ ¹è¿·ÎºÎÅÍ ¿øÇÏ´Â ¸ðµç Á¤º¸¸¦ Á¶»çÇÒ ¼ö ÀÖ´Ù. ÄÚµ¦°ú ¿¬°áµÈ ÆÄÀÏÀÇ È®ÀåÀÚ³ª ¼³¸í µîÀ» ¾òÀ» ¼öµµ ÀÖ°í GDI+·Î ¾î¶² ÆÄÀÏÀ» ´Ù·ê ¼ö ÀÖ´ÂÁöµµ ¾Ë°Ô µÈ´Ù. ½ÇÇà °á°ú´Â ´ÙÀ½°ú °°´Ù.
GDI+´Â ´Ù¼¸°³ÀÇ ÀÎÄÚ´õ¿Í ¿©´ü°³ÀÇ µðÄڵ带 ³»ÀåÇÏ°í ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù. ´ëÁßÀûÀ¸·Î ¸¹ÀÌ »ç¿ëµÇ´Â Æ÷¸ËµéÀº Àß Áö¿øÇÏÁö¸¸ ¾ÆÁ÷µµ ÃæºÐÇÏÁö´Â ¾ÊÀº ÆíÀÌ´Ù. Â÷ÈÄ GDI+ÀÇ ¹öÀüÀÌ ³ô¾ÆÁö¸é Áö¿øÇÏ´Â Æ÷¸ËÀÌ ´õ ´Ã¾î³¯ °ÍÀÌ´Ù.
ÄÚµ¦ Á¤º¸ Áß °¡Àå ÀÚÁÖ »ç¿ëµÇ´Â Á¤º¸´Â ÄÚµ¦ÀÇ CLSIDÀε¥ ƯÁ¤ÇÑ ÀÎÄÚ´õ¸¦ »ç¿ëÇÏ°í ½ÍÀ» ¶§´Â CLSID Á¤º¸°¡ ÇÊ¿äÇÏ´Ù. µð½ºÅ©ÀÇ À̹ÌÁö ÆÄÀÏÀ» ÀÐÀ» ¶§´Â ÆÄÀÏ À̸§¸¸ ÁÖ¸é GDI+°¡ Æ÷¸ËÀ» ÀÚµ¿À¸·Î ÆǺ°ÇÏ¿© ÀûÀýÇÑ µðÄÚ´õ¸¦ È£ÃâÇÏÁö¸¸ ÀúÀåÇÒ ¶§´Â »ç¿ëÀÚ°¡ ¾î¶² Æ÷¸ËÀ¸·Î ÀúÀåÇÏ°í ½ÍÀºÁö¸¦ ÁöÁ¤ÇØ¾ß ÇÑ´Ù. À̹ÌÁö¸¦ ÆÄÀÏ·Î ÀúÀåÇÒ ¶§´Â Image Ŭ·¡½ºÀÇ ´ÙÀ½ ¸â¹ö ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.
Status Save(const WCHAR *filename, const CLSID *clsidEncoder, const EncoderParameters *encoderParams);
ù ¹ø° Àμö´Â ÀúÀåÇÏ°íÀÚ ÇÏ´Â ÆÄÀÏÀÇ °æ·ÎÀÌ¸ç µÎ ¹ø° Àμö°¡ ¾î¶² ÀÎÄÚµù ¹æ½ÄÀ» »ç¿ëÇÒ °ÍÀÎÁö¸¦ ÁöÁ¤ÇÏ´Â ÀÎÄÚ´õ CLSIDÀÌ´Ù. JPEG ÀÎÄÚ´õ¸¦ »ç¿ëÇϸé À̹ÌÁö¸¦ JPG·Î ÀúÀåÇÒ ¼ö ÀÖ°í BMP ÀÎÄÚ´õ¸¦ »ç¿ëÇϸé BMP·Î ÀúÀåÇÒ ¼öµµ ÀÖ´Â °ÍÀÌ´Ù. ¸¶Áö¸· Àμö´Â ÀÎÄÚ´õ·Î Àü´ÞµÇ´Â ÆĶó¹ÌÅÍÀ̸ç À̹ÌÁö ÆÄÀÏÀ» ¸¸µå´Â ¿©·¯ °¡Áö ¿É¼Ç(¿¹¸¦ µé¾î ¾ÐÃà·ü, ½ºÄµ ¶óÀÎ ¼ø¼)À» ÁöÁ¤ÇÑ´Ù.
À̹ÌÁö¸¦ ¿øÇÏ´Â Æ÷¸ËÀ¸·Î ÀúÀåÇÏ·Á¸é ¿øÇÏ´Â Æ÷¸ËÀÇ ÀÎÄÚ´õ CLSID¸¦ ¾Ë¾Æ¾ß ÇÏ¸ç ¶ÇÇÑ ÀÎÄÚ´õ°¡ Ưº°ÇÑ ÆĶó¹ÌÅ͸¦ ¿ä±¸ÇÒ °æ¿ì ÆĶó¹ÌÅ͸¦ ÀÛ¼ºÇÏ´Â ¹æ¹ýµµ ¾Ë¾Æ¾ß ÇÑ´Ù. ´ÙÀ½ ¿¹Á¦´Â BMP ÆÄÀÏÀ» Àоî PNG¿Í JPG Æ÷¸ËÀ¸·Î º¯È¯ÇÏ´Â ±âº»ÀûÀÎ ¹æ¹ýÀ» º¸¿© ÁØ´Ù.
¿¹ Á¦ : ImageConverter |
#include <tchar.h>
TCHAR BmpPath[MAX_PATH];
BOOL GetEncCLSID(WCHAR *mime, CLSID *pClsid)
{
UINT num,size,i;
ImageCodecInfo *arCod;
BOOL bFound=FALSE;
GetImageEncodersSize(&num,&size);
arCod=(ImageCodecInfo *)malloc(size);
GetImageEncoders(num,size,arCod);
for (i=0;i<num;i++) {
if(wcscmp(arCod[i].MimeType,mime)==0) {
*pClsid=arCod[i].Clsid;
bFound=TRUE;
break;
}
}
free(arCod);
return bFound;
}
void OnPaint(HDC hdc)
{
Graphics G(hdc);
if (lstrlen(BmpPath) != 0) {
Image I(BmpPath);
G.DrawImage(&I,0,20);
}
}
void PrintParaList(WCHAR *MimeType)
{
HDC hdc;
CLSID Clsid;
UINT size,i;
EncoderParameters *pPara;
WCHAR ParaGuid[39];
TCHAR str[128];
int y=0;
if (GetEncCLSID(MimeType,&Clsid) == FALSE) {
return;
}
InvalidateRect(hWndMain,NULL,TRUE);
UpdateWindow(hWndMain);
hdc=GetDC(hWndMain);
Bitmap *pB=new Bitmap(1,1);
size=pB->GetEncoderParameterListSize(&Clsid);
if (size == 0) {
wsprintf(str, TEXT("MIME : %s, ÆĶó¹ÌÅÍ ¾øÀ½"), MimeType);
TextOut(hdc,0,y+=20,str,lstrlen(str));
} else {
pPara=(EncoderParameters *)malloc(size);
pB->GetEncoderParameterList(&Clsid,size,pPara);
wsprintf(str, TEXT("MIME : %s, ÆĶó¹ÌÅÍ °³¼ö : %d"), MimeType, pPara->Count);
TextOut(hdc,0,y+=20,str,lstrlen(str));
for (i=0;i<pPara->Count;i++) {
StringFromGUID2(pPara->Parameter[i].Guid,ParaGuid,39);
wsprintf(str,TEXT("GUID:%s, ŸÀÔ:%d, °³¼ö:%d"),ParaGuid,
pPara->Parameter[i].Type,pPara->Parameter[i].NumberOfValues);
TextOut(hdc,0,y+=20,str,lstrlen(str));
}
free(pPara);
}
delete(pB);
ReleaseDC(hWndMain,hdc);
}
void SavePng(TCHAR *Path)
{
TCHAR NewName[MAX_PATH];
Image *pI;
CLSID Clsid;
TCHAR drive[_MAX_DRIVE];
TCHAR dir[_MAX_DIR];
TCHAR fname[_MAX_FNAME];
TCHAR ext[_MAX_EXT];
pI=Image::FromFile(Path);
GetEncCLSID(L"image/png",&Clsid);
_tsplitpath(Path,drive,dir,fname,ext);
wsprintf(NewName,TEXT("%s%s%s.png"),drive,dir,fname);
pI->Save(NewName,&Clsid,NULL);
delete pI;
}
void SaveJpg(TCHAR *Path,ULONG Quality)
{
TCHAR NewName[MAX_PATH];
Image *pI;
CLSID Clsid;
TCHAR drive[_MAX_DRIVE];
TCHAR dir[_MAX_DIR];
TCHAR fname[_MAX_FNAME];
TCHAR ext[_MAX_EXT];
EncoderParameters Para;
pI=Image::FromFile(Path);
GetEncCLSID(L"image/jpeg",&Clsid);
_tsplitpath(Path,drive,dir,fname,ext);
wsprintf(NewName,TEXT("%s%s%s_Q_%03d.jpg"),drive,dir,fname,Quality);
Para.Count=1;
Para.Parameter[0].Guid=EncoderQuality;
Para.Parameter[0].Type=EncoderParameterValueTypeLong;
Para.Parameter[0].NumberOfValues=1;
Para.Parameter[0].Value=&Quality;
pI->Save(NewName,&Clsid,&Para);
delete pI;
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
TCHAR *Mes=TEXT("B:ºñÆ®¸Ê Àбâ, P:PNG·Î ÀúÀå, J:Jpeg·Î ÀúÀå, 1~5:ÆĶó¹ÌÅÍ ¸ñ·Ï Ãâ·Â");
OPENFILENAME OFN;
TCHAR lpstrFile[MAX_PATH]=TEXT("");
switch(iMessage) {
case WM_CREATE:
hWndMain=hWnd;
return 0;
case WM_KEYDOWN:
switch (wParam) {
case TEXT('B'):
memset(&OFN, 0, sizeof(OPENFILENAME));
OFN.lStructSize = sizeof(OPENFILENAME);
OFN.hwndOwner=hWnd;
OFN.lpstrFilter=TEXT("ºñÆ®¸Ê ÆÄÀÏ(*.BMP)\0*.BMP\0");
OFN.lpstrFile=lpstrFile;
OFN.nMaxFile=MAX_PATH;
if (GetOpenFileName(&OFN)!=0) {
lstrcpy(BmpPath,lpstrFile);
InvalidateRect(hWnd,NULL,TRUE);
}
break;
case TEXT('P'):
if (lstrlen(BmpPath) != 0) {
SavePng(BmpPath);
MessageBox(hWnd,TEXT("PNG Æ÷¸ËÀ¸·Î º¯°æÇß½À´Ï´Ù"),TEXT("¾Ë¸²"),MB_OK);
}
break;
case TEXT('J'):
if (lstrlen(BmpPath) != 0) {
SaveJpg(BmpPath,0);
SaveJpg(BmpPath,5);
SaveJpg(BmpPath,10);
SaveJpg(BmpPath,50);
SaveJpg(BmpPath,100);
MessageBox(hWnd,TEXT("JPG Æ÷¸ËÀ¸·Î º¯°æÇß½À´Ï´Ù"),TEXT("¾Ë¸²"),MB_OK);
}
break;
case TEXT('1'):
PrintParaList(TEXT("image/jpeg"));
break;
case TEXT('2'):
PrintParaList(TEXT("image/png"));
break;
case TEXT('3'):
PrintParaList(TEXT("image/bmp"));
break;
case TEXT('4'):
PrintParaList(TEXT("image/gif"));
break;
case TEXT('5'):
PrintParaList(TEXT("image/tiff"));
break;
}
return 0;
case WM_PAINT:
hdc=BeginPaint(hWnd, &ps);
TextOut(hdc,0,0,Mes,lstrlen(Mes));
OnPaint(hdc);
EndPaint(hWnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
»ç¿ë ¹æ¹ýÀº ¾ÆÁÖ °£´ÜÇؼ B Å°¸¦ ´©¸£¸é BMP ÆÄÀÏÀ» ÀÐ¾î ¿À°í PÅ°´Â À̹ÌÁö¸¦ PNG Æ÷¸ËÀ¸·Î, JÅ°´Â JPG Æ÷¸ËÀ¸·Î º¯È¯ÇÏ¿© ÀúÀåÇÑ´Ù. BÅ° ó¸® ÄÚµå´Â ÆÄÀÏ ¿±â °øÅë ´ëÈ»óÀÚ·Î ÆÄÀϸíÀ» ÀÔ·Â¹Þ¾Æ Àü¿ª º¯¼ö BmpPath¿¡ ÀúÀåÇÏ°í ȸéÀ» ¹«È¿ÈÇÏ´Â °£´ÜÇÑ Ã³¸®¸¦ ÇÑ´Ù. OnPaint¿¡¼´Â BmpPath¿¡ ÆÄÀϸíÀÌ µé¾î ÀÖÀ» °æ¿ì ÀÌ ÆÄÀÏÀ» Àоî¿Í ȸ鿡 Ãâ·ÂÇϱ⸸ ÇÑ´Ù.
Æ÷¸ËÀ» º¯È¯ÇÏ´Â ÄÚµå Áß¿¡ »ó´ëÀûÀ¸·Î °£´ÜÇÑ PNG º¯È¯ ÄÚµåºÎÅÍ º¸ÀÚ. ÀÌ ÇÔ¼ö´Â PNG ÀÎÄÚ´õÀÇ CLSID¸¦ Á¶»çÇϱâ À§ÇØ GetEncCLSID¶ó´Â µµ¿ì¹Ì ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. GetEncCLSID ÇÔ¼ö´Â ÀÎÄÚ´õÀÇ ¸ñ·ÏÀ» ¸ðµÎ Á¶»çÇÑ ÈÄ ¸¶ÀÓ Å¸ÀÔ°ú ÀÏÄ¡ÇÏ´Â ÀÎÄÚ´õÀÇ CLSID¸¦ Á¶»çÇÑ´Ù. PNG ÀÎÄÚ´õÀÇ ¸¶ÀÓ Å¸ÀÔÀÌ "image/png"¶ó´Â °ÍÀ» ÀÌ¹Ì ¾Ë°í ÀÖÀ¸¹Ç·Î ÀÌ À̸§À¸·ÎºÎÅÍ CLSID¸¦ ±¸ÇØ Save ÇÔ¼öÀÇ µÎ ¹ø° Àμö·Î ³Ñ±â±â¸¸ ÇÏ¸é µÈ´Ù. È®ÀåÀÚ¸¦ png·Î ¹Ù²Ù´Â ÄÚµå ¶§¹®¿¡ ±æ¾î º¸ÀÌÁö¸¸ ¾Ë¸ÍÀÌ´Â °á±¹ Save ÇÔ¼ö È£Ãâ¹®¹Û¿¡ ¾ø´Ù.
ÇÁ·ÎÁ§Æ® µð·ºÅ丮ÀÇ bird.bmp¸¦ Àоî bird.png·Î ¹Ù²Ù¾î º¸ÀÚ. bmp´Â 440KÀε¥ ºñÇØ png´Â 236K·Î Àý¹Ý Á¤µµ·Î ¾ÐÃàµÈ´Ù. png´Â ºñ¼Õ½Ç ¾ÐÃàÀ̱⠶§¹®¿¡ ¾ÐÃà È¿À²Àº ±×´ÙÁö ÁÁÁö ¸øÇÏ´Ù. µÎ ÆÄÀÏÀº ¿ÏÀüÈ÷ µ¿ÀÏÇÑ À̹ÌÁö¸¦ °¡Áø´Ù.
´ÙÀ½Àº JPG·Î º¯È¯ÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ ¾Ë¾Æ º¸ÀÚ. JPG´Â ´Ù¸¥ ±×·¡ÇÈ Æ÷¸Ë°ú´Â ´Þ¸® ¼Õ½Ç ¾ÐÃàÀ» »ç¿ëÇϴµ¥ ¾î´À Á¤µµ·Î À̹ÌÁö¸¦ ¾ÐÃàÇÒ °ÍÀΰ¡¸¦ ÆĶó¹ÌÅÍ·Î ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. ¾ÐÃàÀ» ¸¹ÀÌ Çϸé À̹ÌÁöÀÇ Á¤º¸°¡ ¸¹ÀÌ ¼Õ½ÇµÇ¹Ç·Î Ç°ÁúÀÌ ¶³¾îÁöÁö¸¸ ÆÄÀÏ Å©±â´Â ÀÛ¾ÆÁø´Ù. ¹Ý¸é ¾ÐÃàÀ» ³Ê¹« Àû°Ô Çϸé À̹ÌÁöÀÇ Ç°ÁúÀº ÁÁ¾ÆÁöÁö¸¸ ÆÄÀÏÀÇ Å©±â°¡ Ä¿Áö´Â ´ÜÁ¡ÀÌ ÀÖÀ¸¹Ç·Î Àû´çÇÑ ¼öÁØ¿¡¼ ¾ÐÃà·üÀ» ¼±ÅÃÇÏ´Â °ÍÀÌ ÁÁ´Ù.
JPG ÀÎÄÚ´õÀÇ ¾ÐÃà·üó·³ °¢ ÀÎÄÚ´õ´Â °íÀ¯ÀÇ ÆĶó¹ÌÅ͸¦ °¡Áú ¼ö Àִµ¥ ÀÌ ÆĶó¹ÌÅÍ ¸ñ·ÏÀº ´ÙÀ½ ÇÔ¼öµé·Î ±¸ÇÒ ¼ö ÀÖ´Ù. ÄÚµ¦°ú ¸¶Âù°¡Áö·Î ÆĶó¹ÌÅ͵µ °³¼ö¿Í ŸÀÔÀÌ °¡º¯ÀûÀ̱⠶§¹®¿¡ Å©±â¸¦ ±¸ÇÏ´Â ÇÔ¼ö¿Í ½ÇÁ¦ ÆĶó¹ÌÅ͸¦ ±¸ÇÏ´Â ÇÔ¼ö°¡ µû·Î Á¦°øµÇ¸ç »ç¿ëÇÏ´Â ¹æ¹ýµµ °ÅÀÇ ºñ½ÁÇÏ´Ù. Å©±â¸¦ ¸ÕÀú ±¸ÇÏ°í ¹è¿¿¡ Åëä·Î Á¶»çÇÑ´Ù.
UINT GetEncoderParameterListSize(const CLSID *clsidEncoder);
Status GetEncoderParameterList(const CLSID *clsidEncoder, UINT size, EncoderParameters *buffer);
ÀÎÄÚ´õÀÇ ÆĶó¹ÌÅÍ´Â EncoderParameters Ŭ·¡½º·Î Ç¥ÇöµÇ´Âµ¥ ÀÌ Å¬·¡½º¿¡´Â ÆĶó¹ÌÅÍÀÇ °³¼ö¸¦ °¡Áö´Â Count¿Í ÆĶó¹ÌÅÍ ¹è¿ Parameter[]°¡ Æ÷ÇԵǾî ÀÖÀ¸¸ç °¢ ÆĶó¹ÌÅÍ´Â ´ÙÀ½°ú °°Àº ¸â¹ö¸¦ °¡Áö´Â EncoderParameter Ŭ·¡½º·Î Ç¥ÇöµÈ´Ù.
¸â¹ö |
¼³¸í |
Guid |
ÆĶó¹ÌÅÍÀÇ °íÀ¯ ½Äº°ÀÚÀ̸ç Àüü ¸ñ·ÏÀº Gdiplusimaging.h Çì´õ ÆÄÀÏÀ» ÂüÁ¶Çϱ⠹ٶõ´Ù. |
NumberOfValues |
Value¹è¿¿¡ ¸î °³ÀÇ °ªÀÌ µé¾î ÀÖ´ÂÁö¸¦ ³ªÅ¸³½´Ù. |
Type |
ÆĶó¹ÌÅÍÀÇ Å¸ÀÔÀ» ÁöÁ¤ÇÏ´Â EncoderParameterValueType ¿°ÅÇüÀÌ´Ù. |
Value |
°ªÀÇ ¹è¿ÀÌ´Ù. |
ÀÌ °ªµé·ÎºÎÅÍ ÆĶó¹ÌÅÍÀÇ ÀÇ¹Ì¿Í Å¸ÀÔ, °ªÀ» Á¶»çÇϰųª ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. ¿¹Á¦ÀÇ PrintParaList ÇÔ¼ö¿¡´Â Àμö·Î Àü´ÞµÈ ÀÎÄÚ´õÀÇ ÆĶó¹ÌÅÍ °³¼ö¿Í °¢ ÆĶó¹ÌÅÍÀÇ GUID, ŸÀÔ, °ª °³¼ö µîÀ» Á¶»çÇØ Ãâ·ÂÇÏ´Â Äڵ尡 ÀÛ¼ºµÇ¾î ÀÖÀ¸¹Ç·Î Âü°íÇϱ⠹ٶõ´Ù. JPEG´Â 4°³, TIFF´Â 3°³ÀÇ ÆĶó¹ÌÅ͸¦ °¡Áö¸ç ³ª¸ÓÁö Æ÷¸ËÀº ÆĶó¹ÌÅ͸¦ °¡ÁöÁö ¾Ê´Â´Ù. ¹°·Ð ÀÌ´Â ÇöÀç ¹öÀüÀÇ GDI+¿¡¼ ±×·¸´Ù´Â °ÍÀÌÁö ´ÙÀ½ ¹öÀü¿¡¼´Â ´Þ¶óÁú ¼öµµ ÀÖ´Ù.
JPG Æ÷¸ËÀ¸·Î ÀúÀåÇÒ ¶§´Â ¾ÐÃà·üÀ» ÁöÁ¤ÇÏ´Â ÆĶó¹ÌÅ͸¦ ÁÙ ¼ö Àִµ¥ ¾ÐÃà·üÀº EncodeQuality GUID¸¦ °¡Áö¸ç Long ŸÀÔÀÇ ¾ÐÃà·ü°ª Çϳª¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. ¾ÐÃà·üÀº 0~100±îÁöÀÇ ¹üÀ§ Áß Çϳª¸¦ ¼±ÅÃÇÒ ¼ö Àִµ¥ 0ÀÌ °¡Àå ¾ÐÃà·üÀÌ ³ô°í 100ÀÌ °¡Àå Ç°ÁúÀÌ ÁÁ´Ù. ¿¹Á¦ÀÇ SaveJpg ÇÔ¼ö´Â ¾ÐÃà·üÀ» Àμö·Î ¹Þ¾Æµé¿© ÀÎÄÚ´õ¿¡°Ô ÀÌ ÀμöÀÇ °ªÀ» ÆĶó¹ÌÅÍ·Î Àü´ÞÇÑ´Ù. Para¿¡ ¾ÐÃà·ü ÁöÁ¤ ÆĶó¹ÌÅÍ Çϳª¸¸ ³Ö°í Save ÇÔ¼öÀÇ ¼¼ ¹ø° Àμö·Î ParaÀÇ Æ÷ÀÎÅ͸¦ ³Ñ±â¸é ÀÎÄÚ´õ´Â ÀÌ ÆĶó¹ÌÅÍÀÇ Áö½Ã´ë·Î ¾ÐÃàÇÑ´Ù.
¿¹Á¦¿¡¼´Â JÅ°¸¦ ´©¸¦ ¶§ ¾ÐÃà·üÀ» ¹Ù²ã °¡¸ç ¿©·¯ °¡Áö ¹öÀüÀÇ À̹ÌÁö ÆÄÀÏÀ» »ý¼ºÇϴµ¥ À̶§ °¢ ÆÄÀϸíÀÇ ³¡¿¡´Â Q_¾ÐÃà·üÀ» ºÙ¿© ¾î¶² Ç°Áú·Î ¾ÐÃàµÈ ÆÄÀÏÀÎÁö¸¦ ½±°Ô ¾Ë¾Æ º¼ ¼ö ÀÖµµ·Ï Çß´Ù. ¾ÐÃà·ü¿¡ µû¶ó Å©±â¿Í Ç°Áú¿¡ ¾î¶² Â÷ÀÌ°¡ ¹ß»ýÇÏ´ÂÁö º¯È¯µÈ °á°ú¸¦ º¸ÀÚ. 100%ÀÇ ¾ÐÃà·üÀ» Àû¿ëÇϸé ÆÄÀÏ Å©±â´Â 98K°¡ µÇ¸ç À̹ÌÁö´Â ¿øº»°ú °ÅÀÇ Â÷ÀÌ°¡ ¾ø´Ù. 50%·Î ¾ÐÃàÇϸé 11K·Î ´ëÆø ÁÙ¾îµéÁö¸¸ Ç°ÁúÀº ´Ù¼Ò ¶³¾îÁø´Ù.
À°¾ÈÀ¸·Î º¸±â¿¡´Â ¿øº»°ú º° Â÷ÀÌ°¡ ¾ø¾î º¸ÀÌÁö¸¸ »ö»ó º¯È°¡ ¸¹Àº ºÎºÐ¿¡¼ µðÅ×ÀÏÀÌ ´Ù¼Ò ¶³¾îÁø´Ù. 10%·Î ¾ÐÃàÇϸé 4.9K·Î ÁÙ¾î °ÅÀÇ ¹é¹è °¡±îÀÌ ¾ÐÃàµÇÁö¸¸ Ç°ÁúÀº ¸¸Á·½º·´Áö ¸øÇÏ´Ù. °úÇÏ°Ô ¾ÐÃàÀ» ÇÏ¸é »ö»ó Á¤º¸¸¦ ¸¹ÀÌ ¹ö·Á¾ß ÇϹǷΠǰÁúÀÌ ¶³¾îÁú ¼ö¹Û¿¡ ¾ø´Ù.
´ÙÀ½Àº 0%, Áï ÃÖ´ë ¾ÐÃà·ü·Î ¾ÐÃàÇØ º» °ÍÀÌ´Ù. Å©±â´Â 3.4KÀ̸ç 130¹è³ª ¾ÐÃàµÇÁö¸¸ ±×¸²Àº °ÅÀÇ ¸ø¾Æº¼ Áö°æÀÌ´Ù.
º¯È¯ °á°ú¸¦ ºñ±³ÇØ º¸¸é ¾ÐÃà·ü¿¡ µû¶ó À̹ÌÁöÀÇ Å©±â¿Í Ç°Áú¿¡ »ó´çÇÑ Â÷ÀÌ°¡ ÀÖÀ½À» È®ÀÎÇÒ ¼ö ÀÖ´Ù. ½ÇÁ¦ ÇÁ·Î±×·¥¿¡¼´Â ´ëÈ»óÀÚ¸¦ ÅëÇØ »ç¿ëÀÚ¿¡°Ô ¿øÇÏ´Â ¾ÐÃà·üÀ» ¼±ÅÃÇϵµ·Ï Çϰųª ¾Æ´Ï¸é ³»Á¤µÈ ¾ÐÃà·üÀ» °¡Áö°í ÀÖ¾î¾ß ÇÒ °ÍÀÌ´Ù.
GDI+¿¡´Â ºñ·Ï °£´ÜÇϱâ´Â ÇÏÁö¸¸ À̹ÌÁöÀÇ ¿©·¯ °¡Áö ¼Ó¼ºÀ» ÆíÁýÇÒ ¼ö ÀÖ´Â ±â´ÉÀÌ ÀÖ´Ù. ´ÙÀ½ ¿¹Á¦´Â GDI+·Î ÇÒ ¼ö ÀÖ´Â À̹ÌÁöÀÇ ¿©·¯ °¡Áö Á¶ÀÛ ¹æ¹ýÀ» º¸¿© ÁØ´Ù. ¿©·¯ °¡Áö ÆíÁý ¸í·ÉµéÀÌ ÇÊ¿äÇϹǷΠ¸Þ´º¸¦ ¸¸µé¾î µÎ¾ú´Ù. ÆÄÀÏ ¸Þ´º¿¡¼ À̹ÌÁö¸¦ ÀÐÀº ÈÄ À̹ÌÁö ¸Þ´ºÀÇ ¿©·¯ °¡Áö ¸í·ÉÀ» »ç¿ëÇؼ À̹ÌÁö¸¦ Á¶ÀÛÇÑ´Ù.
¿¹ Á¦ : ImageAdjust |
#include "resource.h"
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
,LPSTR lpszCmdParam,int nCmdShow)
{
....
WndClass.lpszMenuName=MAKEINTRESOURCE(IDR_MENU1);
}
Image *pImage=NULL;
void OnPaint(HDC hdc)
{
Graphics G(hdc);
if (pImage) {
G.DrawImage(pImage,0,0,pImage->GetWidth(),pImage->GetHeight());
}
}
void OpenFile()
{
OPENFILENAME OFN;
TCHAR lpstrFile[MAX_PATH]=TEXT("");
memset(&OFN, 0, sizeof(OPENFILENAME));
OFN.lStructSize = sizeof(OPENFILENAME);
OFN.hwndOwner=hWndMain;
OFN.lpstrFilter=TEXT("¸ðµç ±×·¡ÇÈ ÆÄÀÏ\0*.bmp;*.jpg;*.gif;*.png\0¸ðµç ÆÄÀÏ(*.*)\0*.*\0");
OFN.lpstrFile=lpstrFile;
OFN.nMaxFile=MAX_PATH;
if (GetOpenFileName(&OFN)!=0) {
if (pImage) {
delete pImage;
}
pImage=Image::FromFile(lpstrFile);
InvalidateRect(hWndMain,NULL,TRUE);
}
}
void Threshold(float value)
{
Graphics *pG=Graphics::FromImage(pImage);
ImageAttributes IA;
INT Width,Height;
Width=pImage->GetWidth();
Height=pImage->GetHeight();
IA.SetThreshold(value,ColorAdjustTypeDefault);
pG->DrawImage(pImage,Rect(0,0,Width,Height),
0,0,Width,Height,UnitPixel,&IA);
delete pG;
}
void Gamma(float value)
{
Graphics *pG=Graphics::FromImage(pImage);
ImageAttributes IA;
INT Width,Height;
Width=pImage->GetWidth();
Height=pImage->GetHeight();
IA.SetGamma(value,ColorAdjustTypeDefault);
pG->DrawImage(pImage,Rect(0,0,Width,Height),
0,0,Width,Height,UnitPixel,&IA);
delete pG;
}
void Lighten(float value)
{
Graphics *pG=Graphics::FromImage(pImage);
ImageAttributes IA;
INT Width,Height;
ColorMatrix matrix = {
1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f, 0.0f,
value, value, value, 0.0f, 1.0f
};
Width=pImage->GetWidth();
Height=pImage->GetHeight();
IA.SetColorMatrix(&matrix,ColorMatrixFlagsDefault,ColorAdjustTypeBitmap);
pG->DrawImage(pImage,Rect(0,0,Width,Height),
0,0,Width,Height,UnitPixel,&IA);
delete pG;
}
void Negative()
{
Graphics *pG=Graphics::FromImage(pImage);
ImageAttributes IA;
INT Width,Height;
ColorMatrix matrix = {
-1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
0.0f, -1.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, -1.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f, 0.0f,
1.0f, 1.0f, 1.0f, 0.0f, 1.0f
};
Width=pImage->GetWidth();
Height=pImage->GetHeight();
IA.SetColorMatrix(&matrix,ColorMatrixFlagsDefault,ColorAdjustTypeBitmap);
pG->DrawImage(pImage,Rect(0,0,Width,Height),
0,0,Width,Height,UnitPixel,&IA);
delete pG;
}
void GrayScale()
{
Graphics *pG=Graphics::FromImage(pImage);
ImageAttributes IA;
INT Width,Height;
ColorMatrix matrix = {
0.299f, 0.299f, 0.299f, 0.0f, 0.0f,
0.587f, 0.587f, 0.587f, 0.0f, 0.0f,
0.114f, 0.114f, 0.114f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f, 1.0f
};
Width=pImage->GetWidth();
Height=pImage->GetHeight();
IA.SetColorMatrix(&matrix,ColorMatrixFlagsDefault,ColorAdjustTypeBitmap);
pG->DrawImage(pImage,Rect(0,0,Width,Height),
0,0,Width,Height,UnitPixel,&IA);
delete pG;
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
switch(iMessage) {
case WM_CREATE:
hWndMain=hWnd;
return 0;
case WM_COMMAND:
switch (wParam) {
case IDM_FILE_OPEN:
OpenFile();
break;
case IDM_IMAGE_HORZFLIP:
if (pImage) {
pImage->RotateFlip(RotateNoneFlipX);
InvalidateRect(hWnd,NULL,FALSE);
}
break;
case IDM_IMAGE_VERTFLIP:
if (pImage) {
pImage->RotateFlip(RotateNoneFlipY);
InvalidateRect(hWnd,NULL,FALSE);
}
break;
case IDM_IMAGE_LEFTROTATE:
if (pImage) {
pImage->RotateFlip(Rotate270FlipNone);
InvalidateRect(hWnd,NULL,TRUE);
}
break;
case IDM_IMAGE_RIGHTROTATE:
if (pImage) {
pImage->RotateFlip(Rotate90FlipNone);
InvalidateRect(hWnd,NULL,TRUE);
}
break;
case IDM_IMAGE_180ROTATE:
if (pImage) {
pImage->RotateFlip(Rotate180FlipNone);
InvalidateRect(hWnd,NULL,TRUE);
}
break;
case IDM_IMAGE_THRESHOLD:
if (pImage) {
Threshold(0.5f);
InvalidateRect(hWnd,NULL,TRUE);
}
break;
case IDM_IMAGE_GAMMA:
if (pImage) {
Gamma(0.5f);
InvalidateRect(hWnd,NULL,TRUE);
}
break;
case IDM_IMAGE_LIGHT:
if (pImage) {
Lighten(0.1f);
InvalidateRect(hWnd,NULL,FALSE);
}
break;
case IDM_IMAGE_DARK:
if (pImage) {
Lighten(-0.1f);
InvalidateRect(hWnd,NULL,FALSE);
}
break;
case IDM_IMAGE_NEGATIVE:
if (pImage) {
Negative();
InvalidateRect(hWnd,NULL,FALSE);
}
break;
case IDM_IMAGE_GRAYSCALE:
if (pImage) {
GrayScale();
InvalidateRect(hWnd,NULL,FALSE);
}
break;
}
return 0;
case WM_PAINT:
hdc=BeginPaint(hWnd, &ps);
OnPaint(hdc);
EndPaint(hWnd, &ps);
return 0;
case WM_DESTROY:
if (pImage) {
delete pImage;
}
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
À̹ÌÁö¸¦ ȸÀüÇϰųª ´ëĪ ¸ð¾çÀ» ¸¸µé ¶§´Â ´ÙÀ½ ÇÔ¼ö¸¦ »ç¿ëÇϸç Àμö·Î ȸÀü ¶Ç´Â ´ëĪ µîÀÇ µ¿ÀÛÀ» ÁöÁ¤ÇÏ´Â ¿°Å »ó¼ö Áß Çϳª¸¦ ÁöÁ¤ÇÑ´Ù.
Status RotateFlip(RotateFlipType rotateFlipType);
typedef enum {
RotateNoneFlipNone = 0,
Rotate90FlipNone = 1,
Rotate180FlipNone = 2,
Rotate270FlipNone = 3,
RotateNoneFlipX = 4,
Rotate90FlipX = 5,
Rotate180FlipX = 6,
Rotate270FlipX = 7,
RotateNoneFlipY = Rotate180FlipX,
Rotate90FlipY = Rotate270FlipX,
Rotate180FlipY = RotateNoneFlipX,
Rotate270FlipY = Rotate90FlipX,
RotateNoneFlipXY = Rotate180FlipNone,
Rotate90FlipXY = Rotate270FlipNone,
Rotate180FlipXY = RotateNoneFlipNone,
Rotate270FlipXY = Rotate90FlipNone
} RotateFlipType;
ÇϳªÀÇ ¿°ÅÇüÀ¸·Î 4¹æÇâÀÇ È¸Àü°ú 4°¡Áö Á¾·ùÀÇ ´ëĪÀ» ¸ðµÎ ó¸®ÇϹǷΠ¿°Å »ó¼öÀÇ °³¼ö´Â ÃÑ 16°³ÀÌÁö¸¸ Áߺ¹µÇ´Â µ¿ÀÛÀÌ ÀÖ¾î ½ÇÁ¦·Î ÀǹÌÀÖ´Â °ªÀº 8°³¹Û¿¡ µÇÁö ¾Ê´Â´Ù. ¿¹¸¦ µé¾î ¼öÁ÷ ´ëĪÀº 180µµ ȸÀü½ÃŲ ÈÄ ¼öÆòÀ¸·Î ´ëĪ½ÃÅ°´Â °Í°ú °°Àº ¼ÀÀÌ´Ù. Â÷ ±×¸²À» ÀÐ¾î ³õ°í ¼öÆò ´ëĪ ¸í·ÉÀ» ³»¸®¸é Â÷ÀÇ ¹æÇâÀÌ ¹Ù²ð °ÍÀÌ´Ù.
´ÙÀ½Àº À̹ÌÁöÀÇ »ö»óÀ» º¯ÇüÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ ¾Ë¾Æ º¸ÀÚ. À̶§´Â ImageAttributes Ŭ·¡½º¸¦ »ç¿ëÇϴµ¥ ÀÌ Å¬·¡½º´Â À̹ÌÁö³ª ¸ÞŸÆÄÀÏÀ» ±×¸± ¶§ »ö»óÀ» ¾î¶»°Ô ´Ù·ê °ÍÀΰ¡¿¡ ´ëÇÑ Á¤º¸¸¦ °¡Áø´Ù. ÀÌ Å¬·¡½ºÀÇ ¿©·¯ °¡Áö ¸â¹ö ÇÔ¼ö¸¦ ÅëÇØ »ö»ó Á¶Á¤ Á¤º¸¸¦ º¯°æÇϸé À̹ÌÁö¸¦ Ãâ·ÂÇÒ ¶§ ¿ø·¡ À̹ÌÁö¿Í´Â Á¶±Ý ´Ù¸¥ »ö»óÀ¸·Î ±×¸± ¼ö ÀÖ´Ù. ÀÌ Å¬·¡½º¸¦ »ç¿ëÇÏ¸é ´ÙÀ½ ¿øÇüÀÇ DrawImage ÇÔ¼ö·Î À̹ÌÁö¸¦ Ãâ·ÂÇØ¾ß ÇÑ´Ù.
Status DrawImage(Image *image, const Rect &destRect, INT srcx, INT srcy, INT srcwidth, INT srcheight, Unit srcUnit, ImageAttributes *imageAttributes, DrawImageAbort callback, VOID *callbackData);
ÀÌ ÇÔ¼öÀÇ ¸¶Áö¸· ¼¼ Àμö´Â »ý·« °¡´ÉÇѵ¥ ImageAttributes¸¦ »ý·«Çϰųª NULL·Î ÁöÁ¤Çϸé À̹ÌÁöÀÇ ¿ø »ö»ó ±×´ë·Î Ãâ·ÂµÇÁö¸¸ ÀÌ °´Ã¼¸¦ ¸¸µç ÈÄ Àμö·Î Àü´ÞÇÏ¸é °´Ã¼¿¡ Æ÷ÇÔµÈ »ö»ó Àç¹èÄ¡ Á¤º¸¸¦ ÂüÁ¶ÇÏ¿© À̹ÌÁöÀÇ »ö»óÀ» º¯ÇüÇÏ¿© ±×¸°´Ù. ImageAttributes Ŭ·¡½º¿¡´Â »ö»ó Àç¹èÄ¡ Á¤º¸¸¦ ÁöÁ¤ÇÏ´Â ¸¹Àº ¸â¹ö ÇÔ¼öµéÀÌ Æ÷ÇԵǾî Àִµ¥ °¡Àå ÀÌÇØÇϱ⠽¬¿î ´ÙÀ½ ÇÔ¼öºÎÅÍ ½Ç½ÀÇØ º¸ÀÚ.
Status SetThreshold(REAL threshold, ColorAdjustType type);
ÀÌ ÇÔ¼ö´Â »ö»ó°ªÀ» ¹ö¸± ÀÓ°èÄ¡¸¦ ÁöÁ¤Çϴµ¥ °¢ »ö»ó ¿ä¼Ò(R,G,B)°¡ ÀÌ ÇÔ¼ö°¡ ÁöÁ¤ÇÏ´Â ÀÓ°èÄ¡º¸´Ù ´õ ÀÛÀ» °æ¿ì 0À¸·Î, Å©¸é 255·Î ¹Ù²Û´Ù. ù ¹ø° Àμö·Î ÀÓ°èÄ¡¸¦ ÁöÁ¤Çϴµ¥ 0~1»çÀÌÀÇ ½Ç¼ö¸¦ ÁöÁ¤Çϸç ÀÌ °ªÀ» ±âÁØÀ¸·Î »ö»ó°ªÀ» Á¶ÀÛÇÑ´Ù. ÀÌ °ªÀÌ 0.5¶ó¸é 128ÀÌ ±âÁØÀÌ µÇ¸ç 0.2¶ó¸é 255*0.2=51ÀÌ ±âÁØÀÌ µÉ °ÍÀÌ´Ù. ±âÁØ°ªº¸´Ù ´õ ÀÛÀº °ªÀº 0ÀÌ µÇ°í ´õ Å« °ªÀº 255°¡ µÇ´Âµ¥ ¿¹¸¦ µé¾î ÀÓ°èÄ¡°¡ 0.5ÀÌ°í ÇÑ Á¡ÀÇ »ö»óÀÌ (120,130,190)À̶ó¸é 128º¸´Ù ´õ ÀÛÀº 120Àº 0ÀÌ µÇ°í 130, 190Àº 255°¡ µÇ¾î °á°ú »öÀº (0,255,255)°¡ µÈ´Ù.
ÀÓ°èÄ¡¸¦ Àû¿ëÇÏ¸é ¸ðµç »ö»ó ¿ä¼Ò´Â ÀÓ°èÄ¡¸¦ ±âÁØÀ¸·Î 0 ¾Æ´Ï¸é 255°¡ µÇ¾î ¿ø»ö °èÅëÀÇ »ö»ó¸¸ ³²°Ô µÇ¾î À̹ÌÁöÀÇ »ö»ó ±¸Á¶°¡ ¾ÆÁÖ ´Ü¼øÇØÁú °ÍÀÌ´Ù. ÀÌ·± È¿°ú´Â »çÁøÀ» Æ÷½ºÅÍ ÇüÅ·Πº¯»ö½ÃÅ°°íÀÚ ÇÒ ¶§ ÈçÈ÷ »ç¿ëµÈ´Ù. ¿¹Á¦¿¡¼´Â ÀÓ°èÄ¡¸¦ 0.5·Î ÁöÁ¤ÇÏ¿© Áß°£ÂëÀ» ±âÁØÀ¸·Î »ö»óÀ» º¯°æ½ÃŲ´Ù.
»ö»óÀÌ È¹ÀÏÀûÀ¸·Î ÅëÀÏµÇ¾î »çÁøÀÌ ±×¸²Ã³·³ ¹Ù²î¾î ¹ö¸°´Ù. µÎ ¹ø° Àμö´Â ´ÙÀ½ ¿°ÅÇü Áß Çϳª¸¦ ÁöÁ¤ÇÑ´Ù.
typedef enum {
ColorAdjustTypeDefault = 0,
ColorAdjustTypeBitmap = 1,
ColorAdjustTypeBrush = 2,
ColorAdjustTypePen = 3,
ColorAdjustTypeText = 4,
ColorAdjustTypeCount = 5,
ColorAdjustTypeAny = 6
} ColorAdjustType;
ImageAttributes °´Ã¼´Â ´Ù¼¸ °¡ÁöÀÇ »ö»ó Á¶Á¤ ´ë»óÀ» °ü¸®Çϴµ¥ ÀÌ ¿°Å°ªÀ¸·Î ¾î¶² ´ë»ó¿¡ ´ëÇØ »ö»ó Á¶Á¤À» Àû¿ëÇÒ °ÍÀΰ¡¸¦ ÁöÁ¤ÇÑ´Ù. Default´Â º°µµÀÇ »ö»ó Á¶Á¤ »óŸ¦ °¡ÁöÁö ¾Ê´Â ¸ðµç ´ë»ó¿¡ ´ëÇØ Àû¿ëÇÏ´Â °ÍÀ̸ç BitmapÀº ºñÆ®¸Ê À̹ÌÁö¿¡ ´ëÇØ Àû¿ëÇÑ´Ù. ³ª¸ÓÁö ºê·¯½Ã, Ææ, ÅؽºÆ®´Â ¸ÞŸ ÆÄÀÏÀ» Ãâ·ÂÇÒ ¶§ GDI ¿ÀºêÁ§Æ®ÀÇ »ö»óÀ» Á¶Á¤ÇÑ´Ù.
Threshold ÇÔ¼ö´Â ÇöÀç ¿·ÁÁø À̹ÌÁö pImage·ÎºÎÅÍ Graphics °´Ã¼ pG¸¦ »ý¼ºÇÏ°í ÀÌ Ç¥¸é¿¡ ´Ù½Ã pImage¸¦ Ãâ·ÂÇ쵂 À̶§ ÀÓ°èÄ¡¸¦ Àû¿ëÇß´Ù. pGÀÇ Ç¥¸éÀÌ °ð pImageÀÎ »óÅ¿¡¼ ÀÌ À̹ÌÁö¸¦ ´Ù½Ã Ãâ·ÂÇϹǷΠ°á±¹ pImageÀÇ À̹ÌÁö¿¡ ÀÓ°èÄ¡°¡ Àû¿ëµÇ´Â °ÍÀÌ´Ù. °°Àº À̹ÌÁö¿¡ ´ëÇØ ÀÓ°èÄ¡¸¦ µÎ ¹ø Àû¿ëÇÏ´Â °ÍÀº ¾Æ¹«·± Àǹ̰¡ ¾ø´Ù. ´ÙÀ½ ÇÔ¼ö´Â °¨¸¶¿Í »ö»ó Çà·ÄÀ» Àû¿ëÇÑ´Ù.
Status SetGamma(REAL gamma, ColorAdjustType type);
Status SetColorMatrix(const ColorMatrix *colorMatrix, ColorMatrixFlags mode, ColorAdjustType type);
°¨¸¶°ªµµ ÀÓ°èÄ¡¿Í ¶È°°Àº ÀýÂ÷´ë·Î Àû¿ëµÇ´Âµ¥ °á°ú »ö»ó°ªÀ» °è»êÇÏ´Â ¹æ½ÄÀÌ ´Ù¸£¸ç À̹ÌÁö°¡ Á¶±Ý ¹à¾ÆÁö´Â È¿°ú°¡ ÀÖ´Ù. Á» ´õ º¹ÀâÇÑ »ö»ó º¯È¯Àº »ö»ó Çà·ÄÀ» »ç¿ëÇÑ´Ù. ColorMatrix ±¸Á¶Ã¼·Î Ç¥ÇöµÇ´Â »ö»ó Çà·ÄÀº 5*5 Á¤¹æ Çà·ÄÀÌ¸ç ¿øº» »ö»ó¿¡ ÀÌ Çà·ÄÀ» °öÇØ °á°ú »ö»óÀ» ¸¸µé¾î³½´Ù. »ö»óÀ» ±¸¼ºÇÏ´Â ¿ä¼Ò´Â 0~255±îÁöÀÇ °µµ¸¦ °¡ÁöÁö¸¸ »ö»ó Çà·ÄÀÌ Àû¿ëµÉ ¶§´Â 0~1»çÀÌÀÇ ½Ç¼ö·Î Ç¥ÇöµÈ´Ù.
GDI+¿¡¼ »ö»óÀ» ±¸¼ºÇÏ´Â ¿ä¼Ò´Â R,G,B,A ³× °¡ÁöÀÌÁö¸¸ ¿©±â¿¡ ´õ¹Ì°ª Çϳª¸¦ ´õÇØ 5*5 Çà·ÄÀ» °öÇÏ¸é °¢ ¿ä¼Ò³¢¸®ÀÇ º¯È¯ ¹æÁ¤½ÄÀ» ¸¸µé ¼ö ÀÖ´Ù. ¸¶Áö¸· ÇàÀº °¢ ¿ä¼Ò¿¡ ´õÇØÁö´Â °ªÀÌ¸ç ¸¶Áö¸· ¿Àº ´õ¹Ì°ªÀ̹ǷΠ¸ðµç ÇàÀÌ 0ÀÌµÇ 5Çà 5¿Àº ¹Ýµå½Ã 1À̾î¾ß ÇÑ´Ù. ¾î¶² »ö»ó (r1,g1,b1,a1,d1)¿¡ ´ëÇØ 5*5 Çà·ÄÀ» °öÇÏ¸é °á°ú »ö»ó (r2,g2,b2,a2,d2)°¡ ³ª¿Ã °ÍÀÌ´Ù.
ÀÔ·Â »ö»óÀÇ d1Àº Ç×»ó 1À̸ç m04~m34±î´Â Ç×»ó 0À̸ç m44´Â Ç×»ó 1À̹ǷΠÃâ·Â »ö»óÀÇ d2µµ Ç×»ó 1ÀÌ´Ù. ÀÌ °ªµéÀº ¾îµð±îÁö³ª °è»êÀ» µµ¿ÍÁÙ »ÓÀÌ´Ù. °á°ú »ö»óÀº ´ÙÀ½°ú °°Àº ¹æÁ¤½ÄÀ¸·Î °è»êµÈ´Ù.
r2=r1*m00 + g1*m10 + b1*m20 + a1*m30 + m40
g2=r1*m01 + g1*m11 + b1*m21 + a1*m31 + m41
b2=r1*m02 + g1*m12 + b1*m22 + a1*m32 + m42
a2=r1*m03 + g1*m13 + b1*m23 + a1*m33 + m43
d2=r1*m04 + g1*m14 + b1*m24 + a1*m34 + m44 = Ç×»ó 1
¸¸¾à »ö»ó Çà·ÄÀÌ ´ë°¢¼± ¹æÇ⸸ 1ÀÌ°í ³ª¸ÓÁö´Â ¸ðµÎ 0ÀÎ ´ÜÀ§ Çà·ÄÀ̶ó¸é ÀÔ·Â »ö»óÀº ±×´ë·Î Ãâ·Â »ö»óÀÌ µÇ°ÚÁö¸¸ ±×·¸Áö ¾Ê´Ù¸é °¢ »ö»ó ¿ä¼Ò³¢¸® ¼·Î ¿µÇâÀ» ¹ÌÃÄ ´Ù¸¥ °á°ú°¡ ³ª¿Ã °ÍÀÌ´Ù. °á±¹ »ö»ó Çà·ÄÀº °á°ú°ªÀ» ¸¸µé¾î ³»´Â 4°³ÀÇ ¹æÁ¤½ÄÀ» ±¸¼ºÇÏ´Â °öÇØÁö´Â °ª, ´õÇØÁö´Â °ªÀÇ ÁýÇÕÀÎ ¼ÀÀÌ´Ù. ¹à±â¸¦ Á¶Á¤ÇÏ´Â Lighten ÇÔ¼ö¿¡ ÀÇÇØ ¸¸µé¾îÁö´Â °á°ú »ö»óÀº ´ÙÀ½°ú °°¾ÆÁø´Ù.
r2=r1+value;
g2=g1+value;
b2=b1+value;
a2=a1;
»ö»ó Çà·Ä¿¡ ÀÇÇØ ÀÌ·± 4°³ÀÇ ¹æÁ¤½ÄÀÌ ¸¸µé¾îÁö°í ÀÌ ¹æÁ¤½ÄÀÇ °á°ú´ë·Î °¢ Çȼ¿ÀÇ Á¡À» Á¶Á¤ÇÑ´Ù. µû¶ó¼ value°¡ ¾ç¼öÀÌ¸é ¹à¾ÆÁú °ÍÀÌ°í À½¼öÀÌ¸é ¾îµÎ¿öÁú °ÍÀÌ´Ù. ¿¹Á¦¿¡¼´Â value·Î 0.1°ú -0.1À» ÁöÁ¤ÇßÀ¸¹Ç·Î 10%¾¿ ¹à¾ÆÁö°Å³ª ¾îµÎ¿öÁø´Ù. ´ÙÀ½Àº ÄÚ½º¸ð½º ±×¸²À» ¿¾î ³õ°í ¹à°Ô¿Í ¾îµÓ°Ô¸¦ °¢°¢ µÎ¹ø¾¿ ½ÇÇàÇÑ °á°úÀÌ´Ù.
À̹ÌÁö¸¦ ¿ª»óÀ¸·Î ¸¸µé ¶§´Â 1.0¿¡¼ ¿ø·¡ °ªÀ» »©¸é µÇ´Âµ¥ r2=1.0-r1¿¡ ÀÇÇØ »ö»ó°ªÀÌ ¹Ý´ë·Î µÚÁý¾îÁö´Â °á°ú°¡ ³ª¿Â´Ù. °ËÁ¤»öÀº Èò»öÀÌ µÇ°í »ö»ó°ªÀº º¸»öÀ¸·Î ¹Ù²ï´Ù. ´ÙÀ½Àº ¹ö¼¸ ±×¸²À» ¿¾î ³õ°í ¿ª»óÀ» Àû¿ëÇÑ °ÍÀε¥ ³×°ÅƼºê »çÁøó·³ º¸ÀδÙ.
±×·¹À̽ºÄÉÀÏ·Î ¸¸µå´Â Çà·ÄÀº ´Ù¼Ò º¹ÀâÇѵ¥ °¢ »ö»ó ¿ä¼Ò³¢¸® ÀÏÁ¤ ºñÀ²À» °öÇÑ °ªÀ» ÃëÇØ ¶È°°Àº °µµ¸¦ °¡Áöµµ·Ï ÇÔÀ¸·Î½á ȸ»ö °èÅëÀÇ »ö»óÀÌ µÇµµ·Ï Çß´Ù. À̶§ ´«¿¡ °¡Àå °ÇÏ°Ô ¶ç´Â G°¡ Á» ´õ Å« ºñÀ²À» °¡Áö°í RÀÌ ±× ´ÙÀ½, B°¡ °¡Àå ÀÛÀº ºñÀ²·Î ¿µÇâÀ» ¹ÌÄ£´Ù. ÃÊ·Ï»öÀÌ °¡Àå ¹à±â ¶§¹®¿¡ ±×·¹ÀÌ ½ºÄÉÀÏ·Î ¹Ù²ð ¶§ °¡Àå ¸¹Àº ºñÁßÀ» Â÷ÁöÇÑ´Ù. RGB°¢°¢ 29:58:14ÀÇ ºñÀ²·Î ¼¯À̴µ¥ ÀÌ ºñÀ²Àº ±×·¡ÇÈ Àü¹®°¡µéÀÇ ¿¬±¸ °á°ú °¡Àå ÀÚ¿¬½º·¯¿î ±×·¹ÀÌ ½ºÄÉÀÏÀ» ¸¸µå´Â ºñÀ²ÀÌ´Ù.
¿ø·¡ Ä÷¯·Î ÂïÀº »çÁøÀε¥ ±×·¹ÀÌ ½ºÄÉÀÏ·Î º¯È¯ÇÏ¿© Èæ¹é »çÁø È¿°ú¸¦ ³» º¸¾Ò´Ù. Èæ¹éÀ¸·Î ºÁµµ ¾ÖµéÀÌ ¾îÂÀ Àú·¸°Ô ¿¹»Ü±î?