Computer/Image Processing

24비트나 32비트가 아닌 BMP 파일은 팔레트를 설정해줘야 그림이 제대로 뜬다.

안그럼 온통 검은 화면만 볼 수 있다.

 

// 파일을 연다.

m_Image.Load("lenna256.bmp");

// 동일한 속성의 이미지를 생성한다.

m_NewImage.Create(m_Image.GetWidth(), m_Image.GetHeight(), m_Image.GetBPP());

// 24 or 32 BPP 가 아닐경우 팔레트를 설정한다.

RGBQUAD ColorTable[256];

for(int i = 0; i < 256; i++)

{

ColorTable[i].rgbRed = i;

ColorTable[i].rgbGreen = i;

ColorTable[i].rgbBlue = i;

}

m_NewImage.SetColorTable(0, 255, ColorTable);

for(int i = 0; i < m_Image.GetHeight(); i++)

{

for(int j = 0; j < m_Image.GetWidth(); j++)

{

m_NewImage.SetPixel(j, i, m_Image.GetPixel(j, i));

}

}

UpdateAllViews(NULL);

pDoc->m_NewImage.Draw(pDC->GetSafeHdc(), 0, 0, pDoc->m_NewImage.GetWidth(), pDoc->m_NewImage.GetHeight());

 

출처 : http://sarojaba.tistory.com/67

대부분의 CImage 함수는 Windows 버전인 Windows 95/98, Windows NT 4.0 또는 Windows 2000에서만 작동합니다. 문서에서는 특정 메서드의 버전 제한을 설명합니다.

CImage::PlgBlt

CImage::MaskBlt

Windows NT 4.0 이상에서만 작동하고 Windows 95/98 이상에서 실행하는 응용 프로그램에서는 작동하지 않습니다.

CImage::AlphaBlend

CImage::TransparentBlt

사용하려면 msimg32.lib 링크해야 하므로 이러한 메서드는 Windows 2000 이상 Windows 98 이상에서만 작동합니다. ( 라이브러리는 Windows 2000 이상 Windows 98 이상에서 실행되는 응용 프로그램에만 사용할 있습니다.)

AlphaBlend TransparentBlt 이러한 메서드가 호출되지 않는 경우에만 Windows 95 또는 Windows NT 4.0에서 실행되는 응용 프로그램에 포함될 있습니다. 응용 프로그램에 이러한 메서드가 포함되어 있고 응용 프로그램을 이전 운영 체제에서 실행해야 하는 경우 링커의 /DELAYLOAD 사용하여 msimg32.lib 로드를 지연해야 합니다. Windows NT 4.0 또는 Windows 95에서 실행되는 동안 응용 프로그램에서 이러한 메서드 하나를 호출하지 않으면 msimg32.lib 로드를 시도하지 않습니다. CImage::IsTransparencySupported 메서드를 사용하면 투명도 지원 코드 사용 여부를 확인할 있습니다.

예제

복사

if (CImage::IsTransparencySupported())

// Safe to call CImage::AlphaBlend and CImage::TransparentBlt

else

// Transparency not supported. Fall back to something else.

이러한 메서드를 호출하는 응용 프로그램을 컴파일하려면 #including 시스템 헤더 앞에 Windows 버전이 5.0보다 크거나 같음을 나타내는 #define _WIN32_WINNT 문을 삽입합니다.

복사

#define _WIN32_WINNT 0x0500

응용 프로그램을 Windows 2000 또는 Windows 98 이전의 운영 체제에서 실행할 필요가 없는 경우 /delayload 사용하지 않고 직접 msimg32.lib 링크할 있습니다.

CImage::Draw

Windows 2000 Windows 98에서 사용하는 경우와 Windows NT 4.0 또는 Windows 95에서 사용하는 경우에 서로 다르게 작동합니다.

0x0500 이하로 설정된 _WIN32_WINNT 사용하여 응용 프로그램을 컴파일하면 Draw 작동하지만 Windows 2000 Windows 98 이상에서 실행되는 시스템에서 투명도를 자동으로 처리하지 않습니다.

0x0500 이상으로 설정된 _WIN32_WINNT 사용하여 응용 프로그램을 컴파일하면 Windows 2000 Windows 98 이상에서 실행되는 시스템에서 Draw 투명도를 자동으로 처리합니다. Windows NT 4.0 Windows 95에서는 Draw 작동하지만 투명도는 지원하지 않습니다. 그러나 위에서 설명한 AlphaBlend TransparentBlt 경우처럼 /delayload 사용하여 msimg32.LIB 로드를 지연해야 합니다.

원래는 psp게임 "스즈미야 하루히의 약속"
 http://b.bngi-channel.jp/psp-haruhi/sos.html 게임을 보고.. 이거 굉장하다 생각하면서
졸업작품에 적용시킬겸 만들었다..

사용자 삽입 이미지


아직 부족한 프로그램이고..
실제 저 하루히에 적용된 프로그램은.. 굉장한거 같다.

스즈미야 하루히의 약속에 적용된 기술도 어디 기획 차원에서 만든게 아니고
http://www.motionportrait.com/about/ 이곳의 모션포트레이트 인가 하는 회사의 기술이다.
일단 보고.. 대강 와핑 기술을 쓴건 아닌가 하고 여러 삽질끝에 만들어 버리긴 했지만..
정말 그들은 와핑을 쓴걸까 ... 보면 볼수록 신기

내가 이미지 처리에 관심을 가진건 지금으로부터 약 1년전 이야기

그때 NDS 게임 개발 인턴사원으로 들어가서 난생 처음 NDS 예뮬을 돌리고
코드 워리어를 사용해서 플밍을 할 때, 솔직히 NDS에 들어가는 BMP는
윈도우의 그것과 같다고 생각했다.

하지만 실상은 다르다.  가끔.. 닌텐도는 괴물들의 집합소라고 생각된다..

자세한건
 http://rosagigantea.tistory.com/75
 http://rosagigantea.tistory.com/76
 http://rosagigantea.tistory.com/77
 http://rosagigantea.tistory.com/78 에 띄어놓았다.

하여간.. 그간 1년동안 NDS는 내친구 할줄 알았지만..

인생이 어디 내 뜻대로인가.. 여차 저차 하는 바람에 현재는 모바일 게임
개발 쪽으로 졸업작품을 진행하고 있다.

졸업작품이다 보니… 그냥 간단한 휴대폰 게임가지고는 통과를 시켜주지 않는다.
그래서… 이미지처리를 잔뜩처리하는 게임을 구상했었는데..

처음엔 우리가 구현할수 있는거긴 한가 라고 했지만.. 막상 대충.. 얼추.. 구현해 보고나니..
Jlet 상황에서.. 속도문제가 심각했다..
기껏 올리니 그림 1장 변환에 10초… 처음 게임 구동할 때 8분가량 소요가 됬었다..

그래서.. 눈을 돌린게 Clet인데.. Clet을 분석하다보니 이것이 NDS의 함수 스타일과
많이 겹쳐 보였다. 물론 메모리 관리를 위해 메모리 버퍼 ID 할당 같은 짓은 없지만
그래서 기존의 이미지 변환기를 Clet에 맞게 개조를 해본 것이 아래와 같다.

사용자 삽입 이미지

Data output 위에 16bit 출력만 추가 했다.

그리고 저렇게 바뀐 결과는
 C언어 파일로 뽑아낼때

사용자 삽입 이미지

그리고 바이너리 파일로 열었을때다
사용자 삽입 이미지

음..실제로 띄울땐 잘될지 않될지 반신반의 했지만 하여튼.. 결과는 아래와 같다.

사용자 삽입 이미지
 잘 나온다.. 허나..
속도는 쾌적한건가? 현재로선 알수 없다... 일단 일을 진행해 나갈뿐.. orz

하지만 우선 Java보다는 C언어계열이 속도 효율이 좋고 (아무래도 Java는 JavaVM을 거치기 때문에 느리다)
객체 지향 프로그래밍 보다는 구조적 언어인 C언어가 훨씬 속도가 빠르다.

실제 작년 NDS 프로그래밍 공부할때, 인턴 끝나기전에 그동안의 결과물을 뱉으라 해서 간단한 슈팅게임을 만들었는데, 클래스로 짤때는 이것이 과연 게임인가 할정도로 버벅이던것이 C로 바꾸니까 속도가 약 5~10배가량 빨라진 느낌이 들정도였다.

최근 배우는 게임서버 프로그래밍..도... C언어로만 짜야 퍼포먼서 100%가량 끌어올릴수 있다고 하니..
아무리 CPU 속도가 빨라져도 C언어를 무시하면 안될꺼 같다.
알고리즘중엔... n^n 승으로 올라가는것도 있고 하니..

종이도 50번 접으면 달까지 갈수 있으니.. 역시 이쪽 세계는 재미있다.

+ Recent posts