'2009/06'에 해당되는 글 5건

  1. 2009/06/19 꿈 내용 정리
  2. 2009/06/15 [WM] Image API 사진 회전 후 저장
  3. 2009/06/14 [WM] SHLoadImageFile 문제점과 Image API
  4. 2009/06/11 도어락 수리기 (2)
  5. 2009/06/08 IF문 주의합시다. ㅠㅠ
일상2009/06/19 11:04

A군은 이른나이에 경찰관이 되기 위해 경찰관 시험을 준비하고 경찰관이 된다.

지방의 농촌에 발령받은 A군은 부모님이 사시는 조금 큰 시골로 놀러를 가게된다.

거기에서 동네에서 자동차로 좁은 길을 가로막는 등 양아치 가족을 보게 된다.

동네사람들과 힘을 합쳐 양아치 가족을 무찌르려 자동차로 위협하지만 오히려 만대로 당하고

근처 경찰서에 끌려가는 신세가 된다.

거기서 경찰관증이 있는 것을 아는데, 경찰관증에 낙서가 여럿있다.

그걸로 경찰관들에게 혼나고 있었는데.. 잠에서 깻다.
저작자 표시 비영리 변경 금지
Posted by 꿍스
삽질2009/06/15 23:03

하루종일 삽질 삽질을 거듭하여 샘플정도로 간단하게 만들어 봤습니다.

CComPtr m_pImgFactory;
CComPtr image;
m_pImgFactory->CreateImageFromFile(filename, &image);

CComQIPtr pBitmap;
CComPtr pBitmapOps;

// 불러온 Iimage로 IBitmapImage 생성
m_pImgFactory->CreateBitmapFromImage(image, 0, 0, PixelFormatDontCare, InterpolationHintNearestNeighbor, &pBitmap);
pBitmap->QueryInterface(IID_IBasicBitmapOps, (void**)&pBitmapOps);
pBitmap.Release();

// 이미지 90도 회전
pBitmapOps->Rotate(90, InterpolationHintNearestNeighbor, &pBitmap);
image.Release();
pBitmapOps.Release();

pBitmap->QueryInterface(IID_IImage, (void**)&image);
		
// 인코딩 코덱 찾기
ImageCodecInfo * codecinfo;
UINT count;
CLSID clsid;
m_pImgFactory->GetInstalledEncoders(&count, &codecinfo);

for(UINT i = 0; i < count ; i++) {
	// JPEG 코덱 찾기
	if(wcscmp(codecinfo[i].MimeType, _T("image/jpeg")) == 0) {
		clsid = codecinfo[i].Clsid;
				
		break;
	}
}
free(codecinfo);

// 인코딩할 파일 저장
CComPtr pEncoder;
m_pImgFactory->CreateImageEncoderToFile(&clsid, _T("파일명"), &pEncoder);

// 인코딩할 이미지 싱크 생성
CComPtr pImgSink;
pEncoder->GetEncodeSink(&pImgSink);
// 기존의 이미지를 이미지 싱크로 보냄
image->PushIntoSink(pImgSink); 
pImgSink.Release();
// 인코딩 종료
pEncoder->TerminateEncoder();
pEncoder.Release();

 

회전 한 파일이 파일명으로 바로 저장됩니다.

저작자 표시 비영리 변경 금지
Posted by 꿍스
삽질2009/06/14 20:06
WindowsMobile 에서만 쓸수있는 SHLoadImageFile 이라는 함수가 있습니다. 이 함수는 편리하게 파일 이름만 넣으면 PNG, JPG, GIF등을 지원해서 편리하게 HBITMAP 형식으로 리턴해 줍니다. 하지만 파일 전체를 무조건 로드합니다.

http://msdn.microsoft.com/en-us/library/aa455003.aspx

윈도우즈 모바일 5 부터 사용할 수 있다고 하지만 그 전에도 undocumented function 으로 사용가능 했던 것 같습니다.(구글신 검색결과)


		// 사진 파일을 지정
		HBITMAP h = ::SHLoadImageFile(filename);
		if(h != NULL) {
			m_photoImage.Attach(h);
		}
		else {
			MessageBox(_T("사진 파일을 불러오지 못했습니다."), _T("Me2PocketUploader"), MB_ICONWARNING);
		}

용량이 큰(실험 결과 1Mbyte 정도) 이상의 파일을 SHLoadImageFile로 로드하면 무조건 NULL이 리턴되었습니다. 

GetLastError로 조사해도 핸들이 잘못되었다는 메시지만 출력합니다. 어리 둥절했던 것은 에뮬레이터에서는 불러오다가 못불러오다가 했습니다. 생각해보니 메모리 용량 때문인거 같습니다. JPG파일 200kb 정도라도 실제 BITMAP으로 디코딩 될때의 메모리 점유는 3Mbyte에 육박 했습니다. 그래서 구글신께 여쭈어서 찾고 찾은것이 Windows CE의 Image API 입니다.

IImagingFactory의 CreateImageFromFile http://msdn.microsoft.com/en-us/library/aa452215.aspx , 로 얻은 IImage 인터페이스의 GetThumbnail함수로 썸네일을 바로 가져왔습니다. 큰 이미지 파일이라도 썸네일로 크기에 맞가 가져오므로 부담이 적습니다. 그래서 메모리 사용량도 상당히 줄었습니다.

저는 WTL을 사용해서 프로그래밍 했기 때문에ATL의 편리한 CComPtr이나 CComQIPtr등 COM이용에 편리한 클래스를 사용 했습니다.

#include 
#include 
#include 

CComPtr m_pImgFactory;
CComPtr m_pImage;
RECT m_photoRect;

// ImageFactory 생성
m_pImgFactory.CoCreateInstance(CLSID_ImagingFactory);

CComPtr image;
m_pImgFactory->CreateImageFromFile(filename, &image);

// 썸네일 생성	
if(image->GetThumbnail(m_photoRect.right - m_photoRect.left, m_photoRect.bottom - m_photoRect.top, &m_pImage) == S_OK) {
	m_photoFilename = filename;
	InvalidateRect(NULL); // OnPaint
}

// 지정된 DC와 영역에 그림을 그림
::GetWindowRect(GetDlgItem(IDC_PHOTO), &m_photoRect);
m_pImage->Draw(hDC, &m_photoRect, NULL);


Image API의 IBasicBitmapOps인터페이스(http://msdn.microsoft.com/en-us/library/ms939536.aspx)를 사용하면


Grouping Methods
Color Control AdjustBrightness

AdjustContrast

AdjustGamma

Manipulation Clone

Flip

Resize

Rotate


이런 것들을 할 수 있네요. 나중에 해봐야 겠습니다. +_+
저작자 표시 비영리 변경 금지
Posted by 꿍스
일상2009/06/11 16:02
외출을 하고 나서 다시 집에왔는데 문이 그냥 열려 있는 것입니다. 이리저리 알아보다가 결국 도어락이 문제 였습니다.

문을 닫으면 문이 잠겨야 하는데 문이 안잠기는 겁니다.


그래서 수동으로 돌려서 잠그려고 하니 중간에 걸려서 더이상 돌아가지 않더군요.

그래서!!! 분해를 시작했습니다. 뒤 부분을 나사로 풀어서 제거 한 후 도어락이 잠그기 위해 돌리는 홀을 수동으로 돌리니 역시나 중간에 걸려서 안돌아 갔습니다. 아래 사진에서 빨간 테두리 부분입니다.


앞 부분도 제가 하고 잠금 뭉치 부분을 풀었습니다.


잠금 뭉치를 풀었더니 잠김부분의 걸쇠 부분이 걸리는 것입니다. 무언가 발라져서 굳은거 같은데 그부분을 때어내고 식용유를 뿌려서 부드럽게 동작하도록 했습니다.


이제 다시 조립을 해야하는데 잠금 뭉치 부분의 나사하나를 잃어벼러서 급하게 집에서 나사를 뒤져서 비슷한 것을 맞췄습니다.


이젠 아주 잘됩니다.!!! 크크크크큭 이상 도어락 수리기 였습니다.

저작자 표시 비영리 변경 금지
Posted by 꿍스
삽질2009/06/08 20:37

Me2PocketUploader 윈도우즈 모바일 버전을 개발하면서 마블(이전은 인텔)의 PXA시리즈 CPU에서는 잘 동작하는 기능이 퀄컴의 MSM시리즈(MSM7200)칩에서는 의도하지 않은 동작을 하였습니다. 어차피 둘다 태생은 ARM 아키텍처 이지만 말입니다. 그것도 무적전설님이 알려주기 전까지는 몰랐습니다.
문제의 코드는 다음과 같습니다.
		// 댓글 닫기
		if(setCloseComment) {
			m_HTTP->AddGetData("close_comment", "true");
		}

 

setCloseCommnet 값이 BOOL값이라 BOOL값은 또 int로 정의되어 있기에 저렇게 작성했었는데, 퀄컴의 MSM CPU에서는 계속 댓글이 닫히는 문제가 생기는 것입니다. setCloseCommnet값이 FALSE라도 실행이 되어버렸던 것이지요. 전 이문제를 단순히 CPU의 아키텍처가 틀려서 라고 생각을 하고 있다가, 다음과 같이 명확하게 TRUE값을 검사했습니다.

		// 댓글 닫기
		if(setCloseComment == TRUE) {
			m_HTTP->AddGetData("close_comment", "true");
		}

 

잘 되는군요... 문제는 역시 저의 코딩 버릇이었습니다. 좀더 명확한 코드를 작성하도록 노력해야겠습니다.!! 테스트 해주신 무적전설님 감사합니다.

저작자 표시 비영리 변경 금지
Posted by 꿍스
TAG C, IF, msm7200, PXA, WM