어디서 가져온건데.. 어디지;; orz

'알고리즘 > 이미지 처리' 카테고리의 다른 글

다각형을 가져오기 위한 노력...  (0) 2008.03.04
ImageWarping Processing  (0) 2008.02.26
PNG 분석자료들  (0) 2008.02.24
이미지 와핑 소스(그나마 낳은거)  (0) 2008.02.20
이미지 와핑에 관해서  (0) 2008.02.19
GDI+에서의 투명색 처리...  (0) 2008.01.25

Morphing = Warping + Dissolving

Warping이란 이미지를 원하는 형태로 왜곡하는 것을 말합니다.
사용자 삽입 이미지

본 소스에서 사용된 기법은 그중에서 Mesh Warp라는 것으로 George Wolberg교수의
기법을 프로그램한 것입니다.
가장쉬운 방법은 line segment를 이용한 weight기법이 있고,
그 다음이 mesh warping입니다.
그 다음이 가장 직관적인 Surface generation기법이 있습니다.
아래에있는 morpro는 3차원 surface generation기법으로 구현한 것입니다만...
interpolation기법에 익숙치 않았던때라 결과물이 상당히 거칩니다.
그에 반해서 이 mesh warping은 catmull-rom의 spline interpolation을 통한
상당히 부드러운 결과물을 보여줍니다.

핵심 엔진은 마소에 연재되었던 이승준선배의 루틴입니다.


출처 : http://www.3dstudy.net/cgi-bin/ez2000/ezboard.cgi?db=download&action=read&dbf=6&page=1&depth=5

'알고리즘 > 이미지 처리' 카테고리의 다른 글

ImageWarping Processing  (0) 2008.02.26
PNG 분석자료들  (0) 2008.02.24
이미지 와핑 소스(그나마 낳은거)  (0) 2008.02.20
이미지 와핑에 관해서  (0) 2008.02.19
GDI+에서의 투명색 처리...  (0) 2008.01.25
이미지 회전 알고리즘  (0) 2008.01.18


어쨋든 출처는 http://plusd.itmedia.co.jp/games/articles/0709/18/news006.html

음... 이미지 1장이라고 한다.
구현할수 있을까...?

참고로 위의 그림은 "스즈미야 하루히의 약속"이라는  PSP게임의 모션보이트 효과이며
저 효과에 사용된 그림은 1장이라고 한다.

추가 자료 사이트
http://www.motionportrait.com/about/

'알고리즘' 카테고리의 다른 글

다중패턴검색 알고리즘  (0) 2014.07.14
NPC 인공지능 처리 기본 구성  (0) 2010.07.04
스즈미야 하루히의 약속  (0) 2008.01.29

사용자 삽입 이미지


위에가 원본 bitmap 밑이 투명처리와 색 변환을 적용한 CachedBitmap.
자주색은 투명처리, 파란색은 노란색으로 변환.

투명처리 및 색 변화 모두 ImageAttributes 라는 객체에 값을 설정해서 Graphics객체의 DrawImage 등을 호출할때 인자로 넣어주면 된다.

[CODE] CachedBitmap* MarkTemplate::CreateCachedBitmap( Graphics* g, Color innerColor )
{
 Bitmap tmpBit( markTp_.GetWidth(), markTp_.GetHeight(), PixelFormat32bppARGB );
 Graphics* pMemGraphics = Graphics::FromImage(&tmpBit);

 ColorMap tplToinner;
 tplToinner.oldColor = tplColor_;
 tplToinner.newColor = innerColor;

 ImageAttributes imgAttr;
 imgAttr.SetRemapTable(1, &tplToinner,ColorAdjustTypeBitmap);
 imgAttr.SetColorKey(transColor_, transColor_,ColorAdjustTypeBitmap );
 pMemGraphics->DrawImage(&markTp_, Rect(0,0,tmpBit.GetWidth(),tmpBit.GetHeight()), 0.0,0.0,markTp_.GetWidth(), markTp_.GetHeight(), UnitPixel, &imgAttr, NULL, NULL);

 delete pMemGraphics;
 CachedBitmap* ccBit = new CachedBitmap(&tmpBit, g);

 return ccBit;
}
[/CODE]


코드는 대략 이런 느낌.
주의할 점은 Bitmap->CachedBitmap으로 바꾸면서 위의 내용을 적용할수가 없기때문에 Bitmap -> 변환된 Bitmap -> CachedBitmap 으로 간다. Bitmap의 변환에는 Graphics객체를 따로 생성해서 그려주는 수밖에 없는듯하다.

'알고리즘 > 이미지 처리' 카테고리의 다른 글

이미지 와핑 소스(그나마 낳은거)  (0) 2008.02.20
이미지 와핑에 관해서  (0) 2008.02.19
GDI+에서의 투명색 처리...  (0) 2008.01.25
이미지 회전 알고리즘  (0) 2008.01.18
Image Processing  (0) 2008.01.18
그림 띄우기  (0) 2008.01.07

코드구루를 검색해보니 Zafir Anjum 라는 분이 만든 다음 함수가 나옵니다.



// GetRotatedBitmap	- Create a new bitmap with rotated image
// Returns		- Returns new bitmap with rotated image
// hBitmap		- Bitmap to rotate
// radians		- Angle of rotation in radians
// clrBack		- Color of pixels in the resulting bitmap that do
//			  not get covered by source pixels
// Note			- If the bitmap uses colors not in the system palette 
//			  then the result is unexpected. You can fix this by
//			  adding an argument for the logical palette.
HBITMAP GetRotatedBitmap( HBITMAP hBitmap, float radians, COLORREF clrBack )
{
	// Create a memory DC compatible with the display
	CDC sourceDC, destDC;
	sourceDC.CreateCompatibleDC( NULL );
	destDC.CreateCompatibleDC( NULL );

	// Get logical coordinates
	BITMAP bm;
	::GetObject( hBitmap, sizeof( bm ), &bm );

	float cosine = (float)cos(radians);
	float sine = (float)sin(radians);

	// Compute dimensions of the resulting bitmap
	// First get the coordinates of the 3 corners other than origin
	int x1 = (int)(-bm.bmHeight * sine);
	int y1 = (int)(bm.bmHeight * cosine);
	int x2 = (int)(bm.bmWidth * cosine - bm.bmHeight * sine);
	int y2 = (int)(bm.bmHeight * cosine + bm.bmWidth * sine);
	int x3 = (int)(bm.bmWidth * cosine);
	int y3 = (int)(bm.bmWidth * sine);

	int minx = min(0,min(x1, min(x2,x3)));
	int miny = min(0,min(y1, min(y2,y3)));
	int maxx = max(x1, max(x2,x3));
	int maxy = max(y1, max(y2,y3));

	int w = maxx - minx;
	int h = maxy - miny;


	// Create a bitmap to hold the result
	HBITMAP hbmResult = ::CreateCompatibleBitmap(CClientDC(NULL), w, h);

	HBITMAP hbmOldSource = (HBITMAP)::SelectObject( sourceDC.m_hDC, hBitmap );
	HBITMAP hbmOldDest = (HBITMAP)::SelectObject( destDC.m_hDC, hbmResult );

	// Draw the background color before we change mapping mode
	HBRUSH hbrBack = CreateSolidBrush( clrBack );
	HBRUSH hbrOld = (HBRUSH)::SelectObject( destDC.m_hDC, hbrBack );
	destDC.PatBlt( 0, 0, w, h, PATCOPY );
	::DeleteObject( ::SelectObject( destDC.m_hDC, hbrOld ) );

	// Set mapping mode so that +ve y axis is upwords
	sourceDC.SetMapMode(MM_ISOTROPIC);
	sourceDC.SetWindowExt(1,1);
	sourceDC.SetViewportExt(1,-1);
	sourceDC.SetViewportOrg(0, bm.bmHeight-1);

	destDC.SetMapMode(MM_ISOTROPIC);
	destDC.SetWindowExt(1,1);
	destDC.SetViewportExt(1,-1);
	destDC.SetWindowOrg(minx, maxy);

	// Now do the actual rotating - a pixel at a time
	// Computing the destination point for each source point
	// will leave a few pixels that do not get covered
	// So we use a reverse transform - e.i. compute the source point
	// for each destination point

	for( int y = miny; y < maxy; y++ )
	{
		for( int x = minx; x < maxx; x++ )
		{
			int sourcex = (int)(x*cosine + y*sine);
			int sourcey = (int)(y*cosine - x*sine);
			if( sourcex >= 0 && sourcex < bm.bmWidth && sourcey >= 0
					&& sourcey < bm.bmHeight )destDC.SetPixel(x,y,sourceDC.GetPixel(sourcex,sourcey));
		}
	}// Restore DCs
	::SelectObject( sourceDC.m_hDC, hbmOldSource );
	::SelectObject( destDC.m_hDC, hbmOldDest );

	return hbmResult;
}

'알고리즘 > 이미지 처리' 카테고리의 다른 글

이미지 와핑에 관해서  (0) 2008.02.19
GDI+에서의 투명색 처리...  (0) 2008.01.25
이미지 회전 알고리즘  (0) 2008.01.18
Image Processing  (0) 2008.01.18
그림 띄우기  (0) 2008.01.07
[본문스크랩] BMP(비트맵) 파일  (0) 2007.09.06

+ Recent posts