WPF2009/08/20 21:33

안녕하세요. 김대욱입니다. 이번시간에 소개해 드릴내용은 WPF에서 사용할 수 있는 AngleGradientBrush를 제작하는 방법이 되겠습니다. AngleGradient란 아래 그림을 보시면 쉽게 이해 하실 수 있을텐데요, WPF에서는 LinearGradient, RadialGradient만을 제공하는걸 하기때문에 (ReflectedGradient와 Diamond Gradient는 LinearGradient를 이용해 구현할 수 있습니다.) 
Angle Gradient와 같은효과 나타내고자 한다면 직접 구현해서 사용해야 합니다.


그런데, 막상 구현을 해서 사용하려고 보면 WPF에서 Custom Brush 제작을 지원하고 있지 않아 직접 구현하는것도 어려워보입니다. 해외 포럼이나 블로거들을 보면 많은 분들께서 Angle Gradient와 관련된 내용에 대해 궁금해 하시는걸 확인할 수 있었는데요. 대부분 Angle Gradient를 Photoshop등에서 미리 그려서 Image File로 가지고 있다가, ImageBrush를 사용하는 방법을 사용한다고 합니다. 하지만, 이런 방법의 경우 Runtime 중에 Gradient Stop을 지정할 수 자유도가 많이 떨어지게 됩니다.

그렇다면 진정 구현할 방법는 것일가요??!?!?!?!?!?!

WPF에서 제공하는 MarkupExtension을 사용하면 생각보다 간단하게 CustomBrush를 구현할 수 있습니다. MarkupExtension이란 XAML을 좀더 확장할 수 있도록 돕는 객체로, 자세한 내용은 아래 URL을 참고하시기 바랍니다.
http://msdn.microsoft.com/ko-kr/library/system.windows.markup.markupextension.aspx
먼저 이번시간에 구현하게될 내용의 시연 동영상을 보고 더 자세히 설명하도록 하겠습니다.



위동영상을 보시면 Runtime중에 자유롭게 Gradient Stop을 지정할 수 있고, Gradient Size, Gradient Detial, CenterPoint등을 의 크기를 지정할 수 있습니다. 원리는 아주 간단합니다. Property를 통해 GradientStop 정보와 Size, Detail, CenterPoint 등의 정보를 입력받고 이를 기반으로 직접 Gradient Image를 생성합니다. 그리고 MarkupExtension의 ProvideValue에 생성한  Image를 사용하는 ImageBrush를 반환 하는 방법을 사용합니다.

그럼 이제 중요한건 Angle Gradient Image를 어떻게 생성하는가가 되겠습니다. 저같은 경우 아래와 그림과 같은 방법을 이용하여 Gradient Color를 계산하고 활용했습니다. WPF에서는 이미 LinearGradient를 제공하기 때문에 Gradient Stop을 입력하면 자연스러운 Gradient 색상을 추출 할 수 있고, 회전 각에 따라 추출된 색상정보를 매핑하면 아래와 같은 Angle Gradient Image를 생성 할 수 있습니다.


아래 코드는 GradientStopCollection에 저장된 GradientStop정보를 가지고 Gradient Color Code를 추출 하는 내용과 ColorCode를 이용해 AngleGradient Image를 생성하는 코드입니다. 코드 자체는 특별하게 어려운 부분은 없으니 한줄한줄 천천히 살펴보시면 이해하시는데에는 무리가 없을것같습니다.


그리고 실제 사용할 때에는 아래와 같이 사용할 수 있습니다.


이번시간에 중요한 내용은 MarkupExtension을 이용해 XAML을 확장하는 방법과 그리고 Gradient Image를 생성하는 부분이 되겠습니다. 그리고 아래는 이번시간에 사용한 전체 소스코드이며, 기타 질문이나 문의는 리플이나, 이메일로 주시면 되겠습니다!




저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 곡스
C#2009/08/17 14:20

안녕하세요. 김대욱입니다. 이번시간에 소개해 드릴내용은 OCR(Optical Character Recognition), 흔이들 문자인식이라고 부르는 기능을 MODI(Microsoft Office Document Image) Libarry를 이용해서 구현하는 방법입니다. 이전에 Tablet SDK를 이용하여 필기인식 방법에대해 소개해 드린바 있었는데요, 이번 시간에는 필기가 아닌 이미지에 포함된 문자를 인식 하는 내용이 되겠습니다. 아래는 시연 동영상 되겠습니다~



먼저 MODI를 사용하기 위해서는 Office 2003 이상의 버전이 설치 되어있어야 하는데요, Office를 설치하실때 아래 그림과 같이 Microsoft Office Document Image를 함께 설치 해주셔야 합니다. (만약 설치 되지 않으셨다면 기능추가/제거 기능을 이용해서 설치 하실 수 있습니다.)


MODI를 사용하시기 위해서는 프로젝트 참조추가에서 아래 그림과 같이 COM 탭에서 Microsoft Office Document Imaging 를 선택하시면 되겠습니다. 저같은경우 Offfice 2007을 설치 했기 때문에 12.0으로 표시 되지만, 2003을 사용하시는 분들은 아마 11.0으로 표시될 것입니다.


실제 MODI를 사용하여 OCR을 구현하기 위해서는 아래와 같이 사용하시면 됩니다. 아래는 샘플 프로젝트에 사용된 인식 관련 함수입니다. 주석이 거의 대부분이고 실체코드는 10줄도 안되니 이해하시는데 무리는 없을것 같습니다 ^^


지금까지 몇몇 이미지로 테스트를 해보았지만, 인식결과는 이미지 상태에 따라 천차 만별인것 같습니다. 5~10도 각도로 회전된 문자에 대해서는 대부분 완벽하게 인식을 수행 하지만, 그이상 혹은 잡음이 많이 포함되어있는 이미지에서는 인식률이 다소 떨어지는것 같습니다.아래는 전체 소스코드입니다.







저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 곡스
TAG c#, MODI, OCR
WPF2009/08/12 18:13

안녕하세요. 김대욱입니다. 최근들어 터치스크린을 이용한 프로젝트를 자주 진행하다보니 이번 포스팅은 터치스크린을 이용하는 시스템에서 유용하게 사용될 수 있는 내용이 되겠습니다. 이번시간에 소개해 드릴 내용은 터치스크린을 사용하는 어플리케이션에서 TextBox등의 Control에 Focus 되었을때 자동으로 Screen Keyboard Application을 실행하는 예제입니다. 동영상을 보시면 쉽게 이해하실수 있습니다.



위 동영상에서는 WIndows에서 기본적으로 제공하는 OnScreenKeyboard를 사용했지만, 이번시간에 소개해 드릴 내용을 응용하면 직접 개발한 Keyboard Application을 사용하실 수도 있습니다. 간단하게 원리를 말씀드리자면 입력가능한 컨트롤 즉, TextBox나 PasswordBox에 Focus 되었을때 미리 지정해놓은 Keyboard Application을 실행하고 Focus를 잃었을때 Keyboard Application을 닫는 원리가 되겠습니다.

컨트롤 하나하나 일일이 Focus이벤트 코드를 추가하는 방법을 사용할수도 있겠지만, 이번시간에 소개해 드릴방법은 Attached DependencyProperty를 사용하여 간단하게 Screen Keyboard를 지원하도록 구현했습니다. 사용할때에는 아래와 같이 사용할 수 있습니다.


아래는 Attached DependencyProperty를 구현한 소스코드입니다.

동작원리는 위에서 설명드린것과 동일하며 Attached Dependency Property를 이해하고 있다면, 어렵지 않게 이해하실수 있을것 같습니다 ^^ 이상으로 이번 포스팅을 마치며 질문의나 문의 사항은 언제든지 연락주시기 바랍니다 ^^ 감사합니다.

소스코드입니다.


저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 곡스
WPF2009/08/03 18:19

안녕하세요. 김대욱입니다. 포스팅제공 기능만들어 놓은지 일주일정도가 지났습니다. 생각보다 많은 분들이 소재를 제공해주고 계서서 감사하다는 말씀 드립니다 꾸벅 (__) 얼마전에 김진필님께서 포스팅 제공기능을 통해 MediaPlayer를 사용하는 예제에 대해 요청해주셨는데요. 이를 반영하여~~!!!  이번시간에 소개해 드릴내용은 WPF에서 제공되는 MediaPlayer를 이용한 영상 Thumbnail이미지 추출 방법입니다. 아래는 구현완료시 결과물 스크린샷입니다.


샘플에 사용된 영상은 헤일로 광고 영상같은데.. 스타크레프트 말고는 아는게임이 없어서 확실한지는 잘모르겠습니다.. ^^;;

먼저 코드를 살펴보겠습니다.

코드가 엄청 길어보이는데, 주석이 절반이므로 너무 걱정하실 필요는 없습니다. 아마 WPF를 사용해서 동영상 플레이어를 제작하고 계시는 분들이나 혹은 예정이신 분들에게는 유용한 정보가 되지 않을가 싶습니다.

주석으로 코드에대한 설명을 적어놨지만, 간단하게 내용을 요약해보자면, MediaPlayer를 생성하고 Thumbnail추출을 원하는 영상을 Open한뒤 Position을 변경해가며 RenderTargetBitmap을 활용해 MediaPlayer의 화면을 캡쳐합니다. 참~~ 쉽줘잉~

아래는 이번시간에 사용한 소스코드입니다. 영상을 Open하시고, Extract Thumbnail버튼을 클릭하시면 자동으로 추출됩니다. 기타 질문은 이메일 또는 리플로 남겨주세요~~


저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 곡스
C#2009/08/01 20:39

안녕하세요. 김대욱입니다. 이번시간에는 전시간에 이어 MetaWeblogAPI를 사용해서 간단하게 블로그에 포스팅하는 방법에 대해 알아보도록 하겠습니다. 그리고 이전시간에 구현해놓은 내용을 바탕으로 아래그림과 같이 탐색기에서 마우스 오른쪽 버튼을 눌렀을경우 나타나는 컨텍스트 메뉴에 "블로그에 올리기"라는 메뉴를 추가하는 방법을 소개합니다.


Shell Context Menu(탐색기에서 오른쪽 버튼을 눌렀을때 나타나는 컨텍스트 메뉴)라고 불리는 녀석에 자신이 원하는 새로운 메뉴를 추가하고자 하는 COM을 이용을 하거나, 간단히 레지스트리만 변경하여 간단하게 구현 할 수 있습니다. 이번시간에 소개할 내용은 간단한 레지스트리 조작만으로 메뉴를 추가하는 방법에 대해 소개합니다.

ShellContextMenu는 레지스트리의 아래와 같은형식으로 레지스트리를 수정함으로서 추가가 가능합니다.

HKEY_CLASSES_ROOT\[확장자명/혹은 형식]\Shell\[대표이름]\Command

예를들어 모든 확장자에 메뉴를 추가하고자 한다면 아래와 같은 과정을 수행하시면됩니다.

1. HKEY_CLASSES_ROOT\*\Shell 키를 찾아값니다. (만약 Shell Key가 없다면 생성하시면 됩니다.)
2. Shell 키에 추가하고자 하는 메뉴이름을 Key로 등록합니다. (꼭 메뉴이름과 동일할 필요는 없습니다.)
3. 등록한 메뉴이름 키의 Default Value를 메뉴에 표시될 이름으로 설정합니다.
4. 그리고 메뉴이름 키에 Command라는 키를 추가합니다.
5. Command 키에 Default Value를 메뉴를 선택했을 경우 실행할 어플리케이션의 경로를 입력합니다.

저같은 경우 모든 파일에서 오른쪽 버튼을 눌렀을때 네이버 블로그에 사진 올리기라는 메뉴가 나타나도록 하기 위하여 아래와 같이 레지스트리를 수정했습니다.

====================================================================
[HKEY_CLASSES_ROOT\*\shell\UploadBlog]
@="네이버 블로그에 사진올리기"

[HKEY_CLASSES_ROOT\*\shell\UploadBlog\command]
@="C:\\SimpleBlogPosting.exe %1"
====================================================================

SimpleBlogPosting.exe 뒤에 붙어있는 %1은 파라미터를 지정하는 값으로 %1을 붙이면 선택한 파일의 이름이 입력되게 됩니다. 위와 같은 내용을 C#으로 작성하게 되면 아래와 같이 구현하실 수 있습니다. (Registry관련 Class는 Microsoft.Win32에 정의되어 있습니다.)


이번 예제의 경우 아래와 같이 폼의 생성자에서 레지스트리에 작성하는 코드를 추가해서 최초 1회 프로그램이 실행되면 자동으로 Shell ContextMenu에 메뉴가 추가되도록 구현했습니다.



위와 같은 방법을 사용해서 아래 그림과 같은 내용의 프로그램을 구현해 보았습니다.


파일에서 마우스 오른족 버튼을 누르고 네이버 블로그에 사진 올리기를 클릭하게되면 자동으로 블로그에 사진을 올려주는 어플리케이션이 되겠습니다. 이전시간에 말씀드렸다싶이 저희 어머니를 위해 제작된 프로그램이라 아주 단순하면서 기본적인 기능만 수행 가능한 형태로 구현됬습니다만, 응용해서 더 다양한 결과를 만들어 내실 수 있을것이라고 생각됩니다.

이상으로 MetaWeblogAPI + ShellCotextMenu를 이용한 블로그 포스팅내용을 마치도록 하겠습니다.
아래는 이번시간에 사용된 전체소스코드입니다.







저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 곡스
C#2009/07/31 02:50
안녕하세요. 김대욱입니다. 이번시간에는 MetaWeblogAPI를 사용해서 MetaWeblogAPI를 사용하는 블로그에 원격으로 포스팅하는 방법에대해 소개해 드리려고합니다. 티스토리나 네이버 다음등의 경우 MetaWeblogAPI를 지원하고 있기때문에 이번시간에 소개해 드릴 내용을 활용하시면 간단하게 원격 포스팅 프로그램을 구현하실수 있습니다.

사실 이번 포스팅을 하게된 계기는 저희 어머니께서 예전부터 디카로 찍은 사진을 블로그에 올리고 싶은데 너무 어렵고 힘들다고 해서 어떻게 하면 간단하게 사진을 올릴 수 있도록 할까.. 고민하다가 간단한 프로그램을 제작해서 선물(?)로 드리고자 구현하면서 내용을 그냥 버리기엔아까워서 포스팅하게 되었습니다 !! ㅎㅎ 아직 완전히 구현된게 아니기 때문에 이번 시간에는 스크린샷은 없지만 완성이 되는대로 스샷과 함께 2번째 포스팅을 하도록 하겠습니다 ㅎ

MetaWeblogAPI는 간단하게 말하면 외부 프로그램을 사용해 블로그에 글을 쓰거나, 수정, 삭제 등을 가능케하는 API라고 할 수 있으며 위키페디아 사전에는 아래와 같이 설명되어 있습니다.

The MetaWeblog API is an application programming interface created by software developer Dave Winer that enables weblog entries to be written, edited, and deleted using web services.

짧은 영어 실력으로 해석을 해보면 위에서 말씀드린내용이 어느정도 맞는것 같습니다 ㅎㅎ MetaWeblogAPI와 관련된 자세한 내용은 http://www.xmlrpc.com/metaWeblogApi에서 확인하실 수 있습니다.

그럼 본격적으로 어떻게 하면 C#을 이용해서 MetaWeblogAPI를 사용할 수 있는가에 대해서 살펴보도록 하겠습니다.
MetaWeblogAPI 는 Application과 Server 간의 통신을 위해 XML-RPC 프로토콜을 사용합니다. XML-PRC 프로토콜을 사용하기 위해서 http://www.xml-rpc.net/에서 제공하는 .Net Framework용 라이브러리를 사용했으며, MSDN에도 이를 사용하는 방법에대해 명시되어 있습니다.(http://msdn.microsoft.com/ko-kr/library/bb259697.aspx)
(MSDN에 기본적인 사용방법은 잘 설명이 되어 있기 때문에 저는 이를 사용한 예제 코드 위주로 설명하겠습니다.)

제가 MetaWeblogAPI를 이용해서 구현하고자하는 목표는 단순하게 "블로그에 사진을 올리자!" 이기때문에 새로운 글을작성하는 newpost메서드와 파일을 블로그 서버에 업로드 하는 newMediaObject 메서드를 아래와 같이 구현했습니다. 이외에 서버로 포스팅내용과 첨부파일을 전송하기 위하여 MetaWeblogAPI에 맞춰 Post Class와 MediaObject Class를 구현했습니다.  아래는 제가 사용한 클래스의 전체 소스코드입니다.


XmlRpcClientProtocol를 상속받아 구현한 MetaWeblogAPI클래스에 XmlRpcUrl Attribute를 사용해 BlogAPI의 주소를 입력합니다. 그리고 그리고 MetaWeblog API 에 따라 newpost, newMediaObject메서드를 구현했습니다. XmlRpcClientProtocol의 Invoke메서드를 호출하게 되면 입력한 내용에 따라 기능을 수행하는데, 이때 XmlRpcClientProtocol에서 메서드 명과 파라미터 구조등을 기반으로 통신하게될 XML Data를 구성하기 때문에 대소문자등에 주의 하시기 바랍니다.

그리고 아래 CreateMediaObject는 파일을 업로드 하기 위한 MediaObject객체를 생성하기 위한 메서드입니다. 해당 파일의 내용을 읽고 Content Type을 지정해주는 역할을 합니다. Content Type을 지정하기 위해서 레지스트리에 등록된 Content Type을 검색하도록 구현했으며 없을경우 Appliation/[확장자] 형태로 입력되도록 했습니다.

실제로 사용할 때에는 아래와 같이 사용하시면 되겠습니다.


newPost를 호출할때나, newMediaObject를 호출할때 ID를 두번 입력하는것을 확인 할 수 있는데, 이는 Naver의경우 BlogID가 UserID와 동일하기 때문입니다. (티스토리등에서는 제공하는 Blog ID를 입력하시면되겠습니다.)
이제 PostTest 메서드를 호출하게 되면 아래와 같이 글과 함께 첨부한그림이 정상적으로 출력되는것을 확인하실 수 있습니다.


이것으로 이번 포스팅은 마치며 다음포스팅에서는 실제 UI와 함께 동작하는 과정을 보면서 설명드리도록하겠습니다.(작성하고 보니까 글이 굉장히 많아서인지 상당히 지루해보이네요..)

아래는 이번시간에 사용된 전체 소스코드 입니다. 테스트시 아이디 비밀번호 입력 부분을 본인의 아이디와 비밀번호를 입력하시기 바랍니다.  저희 어머니께서 사용하시는 블로그가 네이버블로그라서 내용이 기준으로 작성되어 있습니다. 테스트를 하시기 위해서는 네이버에서 블로그를 이용해 테스트 하시거나 MetaWeblogAPI의 XmlRpcUrl을 테스트하고자하는 블로그 API주소로 변경하시기바랍니다.

네이버 블로그에서 MetaWeblogAPI를 사용하는 방법은 아래 URL을 참고하시기 바랍니다.
http://section.blog.naver.com/sub/NoticeTip.nhn?board=/read/1000003488/10000000000003416054





저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 곡스
WPF2009/07/28 03:14

안녕하세요. 김대욱입니다. 자기전에 포스팅 하나 하고자야겠다 싶어 새벽 포스팅 시작합니다. ㅎㅎ

이번시간에 소개해 드릴 내용은 WPF를 이용해 아래와 같이 문자열로 이루어진 이미지를 만드는 방법입니다. 제목은 조금 거창하게 ASCII Art라고 소개했지만 일정 공백을 두고 픽셀 정보를 가져와 이를 문자열로 바꾸기만하면되는.. 매우 간단한 예제가 되겠습니다...(낚시 제목.. ㅈㅅ)  아래 사진속 고양이는 저희집에서 저와 함께 살고 있는 쿠루 입니다 +_+



위 그림에서 보시다 시피 이미지를 입력하면 해당이미지를 문자로만 이루어진 이미지로 변환 하기 때문에 폰트 크기가 작으면 작을 수록 원본이미지와 유사한 이미지로 나타나는 것을 확인 하실 수 있습니다. 구현 방법 소개에 앞서 동영상을 보면서 어떻게 동작하는지 한번 생각해보시기 바랍니다~!! 동영상 캡쳐할때 화질이 좋지 못해서 색상이 이상하게 표현되네요 ㅠㅠ ㅋ 화질좋고 빠른 동영상 캡쳐 툴 있으면 추천해주세요~!~!



사실 이번시간에서의 중요한 대부분의 코드는 XAML보다는 C#코드로 되어있습니다. 설명은 주석에 적어놨으니 참고하시길 바라며 아래는 이미지의 경로를 입력하면 임의의 문자열과 적합한 색상값을 갖는 객체를 추출 하는 작업에 대한 코드입니다.

코드자체가 어렵진 않기때문에 이해하시는 데에는 큰 무리가 없을것으로 생각되며, 제가 이번시간에 ASCII ART예제를 준비하면서 말씀드리고 싶은 중요한 내용은 BmpBitmapEncoder를 이용해서 간단하게 PixelData를 가져올수 있다~!~! 라는것입니다. 예전에 System.Drawing.Bitmap객체를 활용해서 Pixel Data를 접근 방법에 대해 소개해 드린적이있지만, Bitmap Class는 WPF에서 기본적으로 사용하는 Class가 아니기때문에 Reference를 추가하는 등에 작업이 필요합니다, 하지만BmpBitmapEncoder와 MemoryStream을 사용하면 위 작업을 하지 않아도 PixelData에 접근이 가능하기 때문에 이번 예제와 같은 내용을 개발하실 때 상당히 유용할것 같습니다. (단, 위 방법을 사용하실 경우 수정시 원본이미지에 반영 되지는 않습니다..)

나머지 위 코드를 호출하는 부분등은 아래 첨부한 소스코드를 보시면 확인하실수 있습니다. 기타 질문이나 문의 요청사항은 이메일이나 리플 오른쪽 포스팅 소제 제공을 통해 문의 하시면 되겠습니다 ^^

PS. 제작할때 폰트를 굴림체, 돋움체, 궁서체 등 모든 문자의 크기가 동일한 폰트를 활용하면 굳~~~~ 입니다.




저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 곡스
TAG c#, WPF, XAML, 쿠루
WPF2009/06/14 23:34

안녕하세요. 이번시간에는 WPF를 사용해서 간단하게 PhotoMosaic을 구현 해보도록 하겠습니다. 아래는 시연 동영상이며, 화면이 작아 잘안 보이시는 분들을 위해 설명을 드리자면 모자이크를 만들고자 하는 원본 이미지를 불러오고 모자이크에 사용하고자 하는 이미지의 검색어를 입력한뒤 Make버튼을 누르게 되면 Flickr에서 검색어에 해당하는 이미지를 불러와 원본이미지와 함성해주는 내용입니다.




결과를 자세히 살펴보면 다음과 같습니다. (허락 없이 올린 여자친구 사진인데.. 혼나면 어떡하지.............. -_-)

사진을 확대해보면 여러장의 사진이 모여 하나의 사진을 이루고 있는 모습을 확인 하실 수 있습니다.. PhotoMosaic을 구현하는데 있어 색상정보를 기반으로 하는 방법등 여러가지 방법이 있지만, 이번시간에 구현한 방법은 가장 간단하게 구현 할 수 있는 Tile Image의 투명도를 조절하여 구현하는 방법입니다. 

아래는 PhotoMosaic을 구현하는데 사용한 소스코드이며 코드에 대한 설명은 주석으로 달아놓았습니다!!


간단하게 요약하자면 DrawingImage를 사용해 원본이미지를 가장 먼저 그리고 Flickr에서 검색된 이미지들을 랜덤하게 그려주는 과정을 수행합니다. 이때 Flickr에서 검색된 Tile Image의 Opacity를 낮춰 배경이 비치도록 만들어 마치 여러장의 이미지들이 하나의 이미지를 이루는것과 같은 효과를 냅니다.

위 코드에서 가장 중요한 부분은 Flickr에서 이미지를 불러올때 CacheOption을 사용하여 이미지가 재사용될때 빠르게 응답할 수 있도록 하는 부분에 있습니다. (CacheOption을 사용하지 않으면 저장할때 엄청난 시간이 소요될 수 있습니다..)

실제 사용하실 때에는 아래와 같이 간단히 객체를 생성한뒤 Source Image를 지정하고 Tile의 Scale을 지정한 뒤 Make함수를 호출하시면 되겠습니다.


아래는 이번시간에 사용된 전체소스코드이며 기타 질문이나 요청 문의 등은 이메일 또는 리플로 남겨주시면 답변드리겠습니다 ^^


PS. 반드시 사용전에 Flickr API Key를 본인의 Key로 변경하신 뒤 사용하세요~ 안그러면 에러납니다요~


저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 곡스
C#2009/06/13 01:22

안녕하세요. 이번시간에는 Windows Mobile과 Motion Sensor가 탑제된 단말기에서 Sensor Data를 취득하기 위한 Library의 구현에 대해 알아보도록 하겠습니다. 테스트는 얼마전에 구입한 옴니아로 진행했으며 정상적으로 동작되는것을 확인 했습니다. 제가 특별히 동영상 촬영 장비가 없기때문에 이번 시간 구현 결과물은 영상으로 준비는 못했습니다요 ㅜㅜ 직접 실행 하시게 되면 아래와 같은 동작 화면을 확인 하실 수 있습니다. (이번시간 내용은 특별하게 UI를 고려하지 않아서 매우 심플합니다...... ㅎㅎ)

아직까지는 .Net CF를 사용하여 Windows Mobile을 개발하는 사람이 많질 않아서(최근에 점점 늘어나고 있다고합니다.) 그런지 당현이 있을 거라 생각했던 C#으로 구현된 Motion Sensor관련 코드가가 없는거 같아서 (대부분 C++로 구현되어 있더라구요..) 새로 구현하게 되었습니다. C#으로 구현했다고해서 기존 방식과 전혀 다른 방식으로 구현했다는 뜻은 아니며 기존의 C++로 구현된 내용을 C#으로 포팅 한것정도로 생각하시면 되겠습니다.

포팅시에 참고한 코드는 예전에 옴니아 소프트웨어공모전에서 삼성전자에서 배포한 MotionSensor관련 코드를 거의 그대로 포팅하고 몇가지 편리 기능정도만 추가 및 간단한 최적화 정도만 진행 한거라 잠재되어 있는 버그가 존재 할 수 있습니다.

간단하게 구조를 살펴보면 MotionSensorData, MotionSensorDataType, MotionSensor로 구성되어 있습니다. 각각의 항목에 대해 설명하면 아래와 같습니다.

- MotionSensorData : Motion Sensor로부터 수신한 XYZ축의 SensorData를 포함할수 있는 Structure입니다.
- MotionSensorDataType : MotionSensor와 통신할때 요청할 데이터 Type에 대한 Enum입니다.
- MotionSensor: 실제 Motion Sensor와 통신하는데 사용하는 Class입니다.

MotionSensor Class의 소스코드는 아래와 같으며 설명은 주석에 포함시켰습니다. 


※ 포인터를 사용하여 디바이스와 통신을 수행하기 때문에 unsafe 키워드를 사용했습니다.


그리고 아래는 실제 코드에서 MotionSensor객체를 사용하는 방법에 대해 설명입니다.

간단하게 MotionSensor객체를 생성하고 GetMotionSensorData()를 호출하거나 X,Y,Z Property를 바로 사용하시면 되겠습니다.
단, X,Y,Z Property를 사용하실때에는 해당 Property를 요청할때마다 데이터를 다시 수신하게 되므로 하나의 루틴에서는 해당 Property가 리턴한 값을 복사하여 사용하시면 되겠습니다.

이상으로 오늘 포스팅을 마치며 기타 궁금하신 점이나 다른 문의는 이메일 또는 리플로 남겨주시기 바랍니다.
아래는 이번시간에 구현한 소스코드입니다.







저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 곡스
WPF2009/05/14 11:09

안녕하세요. 김대욱입니다. 거의 한달만에 포스팅이네요 >_< 포스팅 할 내용을 적어놓은 메모장에는 자꾸 늘어나는데..
현재 진행하고있는 프로젝트 마감때문에 정신이 하나도 없어서 포스팅을 재때 못하고 있습니다 ㅠ_ㅠ 이해해주세요 (굽신굽신)

이번시간에는 얼마전 포스팅에서 소개해드린바있는 Fixed Image Control(http://whatisthat.co.kr/150)를 WPF의 Attatched Dependency Property를 사용하여 어떤 컨트롤에나 적용될 수 있는 PixelSnapper를 구현해 보도록 하겠습니다. 아래는 시연동영상 입니다.



먼저 간단하게 Attatched DependencyProperty에 대해 설명을 드리자면, 우리가 일반적으로 사용하는 Button라는 객체가 있을때 Button에는 Animation이라는 Property가 존재 하지않습니다. 만약 Animation이라는 Property를 추가하고자 한다면 기존에는 Button객체를 상속받아 Animation Property를 포함한 새로운 객체를 생성해주어야했죠. 하지만 WPF에서는 Attatched Property를 사용하여 새로운 객체를 생성할 필요없이 Button객체에 Property를 부여 할 수 있습니다. ( 간단하게 활용면에서만 설명을 한 내용이라 다소 실제 내용과 차이가 있을 수 있습니다.)

원래의 목적은 부모와 자식간의 Dependency Property를 연결짓기 위해 사용되는 방법으로, 대표적인 Grid의 Grid.Row, DockPanel의 DockPanel.Dock가 있으며 이번시간에는 이런 Attatched Dependency Property를 사용하여 어느 컨트롤에서나 적용할 수 있는 Pixel Snapper를 구현 해보고자 합니다. Attatched Dependency Property와 관련된 보다 자세한 내용은 MSDN을 참고해주시기 바랍니다.(http://msdn.microsoft.com/ko-kr/library/ms749011.aspx)

아래는 PixelSnapper의 AttatchedDependency Property를 정의하는 부분입니다.

Attatched DependencyProperty를 사용하기 위해 DependencyProperty를 RegisterAttached 메서드를 사용하여 등록하고, Property에 접근하기 위한 Get,Set메서드를 위와 같이 정의했습니다. 이때 이름은 반드시 Get[PropertyName] , Set[PropertyName]과 같이 구현이 되어야 하며 모든 FrameworkElement에 IsSnap Property를 노출시킬 것이기 때문에 Parameter 로  FrameworkElement를 사용했습니다.

그리고 본격적으로 FrameworkElement의 IsSanp에 따라 객체의 Pixel 고정여부를 지정하기 위해 IsSnap Property가 갱신되었을때 아래와 같은 처리를 해줍니다.

LayoutUpdate의 경우 sender에 null이 들어오기때문에 어떤 객체로부터 호출되었는지를 판단하기 위해 람다식을 이용하여 파라미터로 Target객체를 넘기는 대리자를 생성하여 LayoutUpdate를 호출하게 됩니다. 이외 나머지 소스코드 부분은 대부분 이전에 소개해드릴 Fixed Pixel Control과 동일하므로 설명은 여기까지로 하고, 실제 사용할때에는 아래와 같이 사용하시면됩니다.

[XAML에서의 사용]


[C#에서의 사용]

더 궁금하신점이나 기타 문의는 이메일이나 댓글로 남겨주시면 되겠습니다. 아래는 테스트를 할 수 있는 소스코드입니다.




 

저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 곡스