임베디드 프로그래밍  

         
전체 기타 | WinCE | Delphi | VisualC | ARM | Media | SE | 마리오네트 | Java | wdm | JTAG | 영상처리 | 인증 | 질문/답변 | H/W | 알고리즘 | Platform | .net | VB | PPC | Network | android | QT | WWW | Linux |
[펌CEFAN] WINCE 에서 DIB 의 사용
하창호10-18 23:19 | HIT : 9,687
글쓴이: mobian 글쓴 날짜: 2001-11-23 오후 5:06
모비안 입니다.

포켓 갤러리의 회전.. 인정합니다. 쓸수 없을 정도로 느립니다. 참고로 같은 알고리즘으로 PC에서 돌려도 느리다는 것을 느낌니다. (소프트웨어에서 알고리즘의 중요성을 다시 한번 일깨워줍니다.)

Rotate를 구현할 때 제가 참조한 사이트입니다. 가장 간단한 방법으로 (아주 비효율적인 방법을 썼구요.. 3번째 방법을 이용하시면 될것 입니다.)

http://codeguru.earthweb.com/bitmap/rotate_bitmap.shtml

포켓 갤러리의 rotate기능을 보강 시켜주세요!  


답글
추천   글 3/8  

글쓴이: dawnbell 글쓴 날짜: 2001-11-23 오후 9:15
답변 감사드립니다. 근데 몇가지 이해가 되지 않는 부분이 있네요.. 님이 가르쳐 주신 사이트의 방식을 따라서 해 보다 보니까 몇 가지 문제가 있는데요.. 우선 HBITMAP 과 HDIB의
차이가 뭔가요.. HBITMAP은 비트맵 핸들이고 HDIB는 DIB 핸들인것 같은데...

그리고 DIB를 생성한 후에 Draw를 하려고 할 때 포켓 갤러리의 소스에는 HBITMAP을 이용해서 SelectObject(g_dc, m_hbitmap)을 이용해서 DC에 뿌려 주는데 여기서 hbitmap은 어떻게 구하면 되나요?  비트맵 핸들 대신에 DIB핸들을 사용하니까 제대로 Draw가 되지 않네요.. 제가 이쪽으로는 영 문외한 이라서 모르는게 넘 많네요... -_-   DIB 핸들을 가지고 Draw 하려면 딴 함수를 사용해야 하나요.. PC 기반에서는 SetDIBitsToDevice() 함수를 가지고 Draw가 가능하던데.. 이 함수는 CE에서는 지원되지 않는군요.. 흠 답답하네요.. 조언을 부탁드립니다.

그럼 수고하세요..


답글
추천   글 4/8  

글쓴이: mobian 글쓴 날짜: 2001-11-24 오전 8:18
모비안 입니다.

먼저 관련 서적을 참고하시기 바랍니다. 그리고 이해되지 않는 부분을 질문하는 예(?)도 있으면 좋구요. 무작정 갈켜달라고 하믄... 답변하는 사람도 어렵지 않을까요? (어설프게 이해하는 사람이 답변하기 어렵겠죠)

Programming Microsoft Visual C++ 5th Edition을 참고하면..
  
GDI Bitmaps and Device-Independent Bitmaps
There are two kinds of Windows bitmaps: GDI bitmaps and DIBs. GDI bitmap objects are represented by the Microsoft Foundation Class (MFC) Library version 6.0 CBitmap class. The GDI bitmap object has an associated Windows data structure, maintained inside the Windows GDI module, that is device-dependent. Your program can get a copy of the bitmap data, but the bit arrangement depends on the display hardware. GDI bitmaps can be freely transferred among programs on a single computer, but because of their device dependency, transferring bitmaps by disk or modem doesn't make sense.

그리고 HDIB -> HBITMAP 관련해서는 아래 함수를 참고하시기 바랍니다. (제가 왜 간단한 방법을 사용한 이유를 아시겠죠.. 이것 저것 해야하는 것이 복잡해서 였습니다. )

HBITMAP CreateDIBitmap(
  HDC hdc,                        // handle to DC
  CONST BITMAPINFOHEADER *lpbmih, // bitmap data
  DWORD fdwInit,                  // initialization option
  CONST VOID *lpbInit,            // initialization data
  CONST BITMAPINFO *lpbmi,        // color-format data
  UINT fuUsage                   // color-data usage
);



답글
추천   글 5/8  

글쓴이: dawnbell 글쓴 날짜: 2001-11-28 오전 9:08
안녕하세요.. 오랜만에 글을 올리네요.. 모비안님이 가르쳐 주신 이미지 회전 방식을

쓸려고 무진장 노력을 하는데 잘 안되네요.. 일단 이미지 파일로 HDIB을 받아서 Draw

시키는건 성공을 했는데.. 문제가 있습니다. 이미지의 크기가 큰 파일(640x480)의 경우에

화면에 나타나지가 않네요.. 아래 소스는 제가 Visual C++ 5.0 완벽가이드에서 참조해서

만든 PaintImage 함수인데요...

BOOL WINAPI PaintDIB(HDC     hDC,
     LPRECT  lpDCRect,
     HDIB    hDIB,
     LPRECT  lpDIBRect,
     CPalette* pPal)
{
LPSTR    lpDIBHdr;            // Pointer to BITMAPINFOHEADER
LPSTR    lpDIBBits;           // Pointer to DIB bits
BOOL     bSuccess=FALSE;      // Success/fail flag
HPALETTE hPal=NULL;           // Our DIB's palette
HPALETTE hOldPal=NULL;        // Previous palette
/* Check for valid DIB handle */
if (hDIB == NULL)
  return FALSE;
/* Lock down the DIB, and get a pointer to the beginning of the bit
  *  buffer
  */
lpDIBHdr  = (LPSTR)hDIB;
lpDIBBits = (lpDIBHdr + *(LPDWORD)lpDIBHdr + ::PaletteSize(lpDIBHdr));
// Get the DIB's palette, then select it into DC
if (pPal != NULL)
{
  hPal = (HPALETTE) pPal->m_hObject;
  // Select as background since we have
  // already realized in forground if needed
  hOldPal = ::SelectPalette(hDC, hPal, TRUE);
}
HDC hDCSrc = CreateCompatibleDC(hDC);
LPSTR lpBits; // Pointer to DIB bits
HBITMAP hBitmap = ::CreateDIBSection(hDC, (BITMAPINFO*)(lpDIBHdr), DIB_RGB_COLORS, (void**)&lpBits, NULL, 0);
DWORD   dwSize = GlobalSize(hDIB) - sizeof(BITMAPINFOHEADER) - 256 * sizeof(RGBQUAD) - 24;
memcpy(lpBits, lpDIBBits, dwSize);

HBITMAP hOldBitmap = (HBITMAP)::SelectObject(hDCSrc, (HGDIOBJ)hBitmap);
::BitBlt( hDC, 0, 0, RECTWIDTH(lpDCRect), RECTHEIGHT(lpDCRect), hDCSrc, 0, 0, SRCCOPY );
::SelectObject(hDCSrc, hOldBitmap);

::DeleteObject(hBitmap);
::DeleteDC(hDCSrc);
/* Reselect old palette */
if (hOldPal != NULL)
  ::SelectPalette(hDC, hOldPal, TRUE);
   return bSuccess;
}

위쪽의 소스에서 빨간색으로 쳐진 부분이 문제가 생깁니다.
DWORD   dwSize = GlobalSize(hDIB) - sizeof(BITMAPINFOHEADER) - 256 * sizeof(RGBQUAD) - 24;
memcpy(lpBits, lpDIBBits, dwSize);

이미지의 사이즈를 구하는 함수에서 640x480 크기의 파일을 로딩하니까

dwSize의 크기가 310200정도가 나오더라구요.. 그리고 나서 memcpy를 할때

에러가 생기더군요..  크기가 작은 사이즈의 경우는 화면에 잘 나타나거든요.

이 방법말고 SetDIBitsToDevice 함수와 같은 기능을 하는 CE용 Draw 함수는 없

나요.. 모비안님이 가르쳐 주신
HBITMAP CreateDIBitmap(
  HDC hdc,                        // handle to DC
  CONST BITMAPINFOHEADER *lpbmih, // bitmap data
  DWORD fdwInit,                  // initialization option
  CONST VOID *lpbInit,            // initialization data
  CONST BITMAPINFO *lpbmi,        // color-format data
  UINT fuUsage                   // color-data usage
);

함수는 CE에서 Help에 나와 있지 않더군요.. 그래서 CreateDIBSection 함수를 썼거

든요.  답변 부탁드립니다. 그럼 수고하세요..



답글
추천   글 6/8  

글쓴이: mobian 글쓴 날짜: 2001-11-28 오전 9:44
모비안 입니다.

개인적으로 그래픽 관련 관심이 있기에 저도 쪼매 신경을 써보는데.. FULL API를 지원하지 않는 CE에서는 이래 저래 힘든것은 사실입니다.

그런데, 이래 저래 찾아보믄.. 답으로 갈수 있는 길도 찾을 수 있습니다.

아래 사이트를 참조하시기 바랍니다. 님의 문제는 대부분 이미 다른 사람들이 고민했던 것인 경우가 많습니다. (전세계를 대상으로 하믄..)

http://www.codeguru.com/bitmap/DIBSectionLite.shtml

위 사이트에 요런 글귀가 있군요~ "With the advent of CE, DIBSections have become even more important. Since CE is an abridged version of the Windows operating system, many of the usual APIs we know and love have been left out. If you wish to use DIBs in CE, then your only option is to use DIBSections. In a subsequent article I will extend the class presented here in order to show how to use DIBsections in CE"

그런데 그 방법을 쓰면 빠르긴 빠른가요? 얼마나 빠르지요... 답변 부탁드립니다. 글쿠, 멋지게 만들어서.. 약간의 설명을 포함해서 공개 부탁드립니다. 나도 포켓 갤러리에 구현해야쥐~~  

PS. 지식이란 단순한 정보가 아닙니다. 전달할 수 있는 잘 정리된 정보가 지식입니다.


답글
추천   글 7/8  

글쓴이: dawnbell 글쓴 날짜: 2001-11-28 오후 3:47
아 드디어 성공을 했습니다. 아까 제가 올린 소스에 잘못된 부분이 있더군요..

이미지 사이즈를 구하는 구분이 잘못 되서요.. 그래서 이미지 계산이 제대로 안된거였습니다.

비트맵 해더에 이미지 사이즈 정보가 있어서 그걸 이용했더니 되더군요..  그리고 회전과

미러링 기능을 구현 했습니다. 그래픽 라이브러리는 VOImage는 아무래도 로딩하는데 속도가

좀 떨어져서 그냥 Bitmap파일하구 Jpeg라이브러리 써서 Jpeg만 로딩이 되도록 했습니다.

회전 속도는 640x480 사이즈 이미지가 90도 회전시키는데 약 1초정도 밖에 안 걸리더군요..

미러링은 더 빠르고요.. 알고리즘은 기존에 어느분이 VC++로 짜 놓은 프로그램이 있어서

그걸 포팅해서 사용했습니다. 이미지 프로세싱 관련된 기능이(회전, 미러링, 명암조절...) 거의

다 구현 되 있더군요..  저도 관련기능을 다 구현해 볼 생각입니다. 지금 정리하고 있으니까

곧 완성될 것 같습니다. 정리 되는데로 곧바로 올리도록 하죠.. 그럼 수고하세요..





90  WinCE :: QR CODE 관련 2차원 바코드  …1  하창호 2010·01·06 5790
89  WinCE :: EVC 설치시 REG.VBS 파일 Script Host Error...  …2  하창호 2009·02·24 5002
88  WinCE :: EVC Window Fatal Error 8000002 관련 ...    하창호 2009·02·19 3779
87  WinCE :: 소프트 키보드 가상 키보드 상태 알아내기    하창호 2009·01·09 8075
86  WinCE :: CE 에서 쉘로 키보드 띄우고 없애기    하창호 2008·12·31 3952
85  WinCE :: Automating the Device Emulator Mana...    하창호 2008·12·02 2885
84  WinCE :: 사용가능한 메모리 Memory 용량 구하기    하창호 2008·11·13 6776
83  WinCE :: EVC 와 Visual C 차이첨    하창호 2008·07·24 3215
82  WinCE :: CE 및 PC용 Dos 에뮬레이터    하창호 2008·04·15 4817
81  WinCE :: CTime 관련 황단한 버그    하창호 2008·02·22 4144
80  WinCE :: SoftKeyboard 사용하기    하창호 2007·08·30 4226
79  WinCE :: CE .NET Product Key    하창호 2007·08·29 3976
78  WinCE :: WinCE Window Create 할 때 창순서 틀려질 때...    하창호 2007·08·09 4161
77  WinCE :: CE BSP 에서 스타일러스 켈리브레이션 저장하는 방법    하창호 2007·06·05 4406
76  WinCE :: 디렉토리 존재 여부 알아내는 방법 중 CE와 VC가 다른점    하창호 2007·04·23 5430
75  WinCE :: #if define , #ifdef, #elif, #else, ...  …1  하창호 2007·04·23 4894
74  WinCE :: BMP 불러오는 CE및 VC 함수    하창호 2007·04·18 5584
73  WinCE :: IImage CE용 이미지 컴포넌트 사용법 예제    하창호 2007·04·04 4511
72  WinCE :: CE 에서 현재 실행파일이 실행중인 디렉토리 알아내기 ...    하창호 2007·03·07 5521
71  WinCE :: 임베디드 객체형 데이터 베이스 db4o    하창호 2007·01·09 3720
70  WinCE :: How to Use Remote Tools to Track Me...    하창호 2006·12·01 3993
69  WinCE :: WinCE 4.2 빠른 빌드 방법  …1  하창호 2006·11·30 4183
68  WinCE :: AlphaBlend 사용예제  …2  하창호 2006·11·30 10250
67  WinCE :: NAND 플래시메모리를 fat형식으로 파티션 나누는 방법  …3  하창호 2006·10·31 7801
66  WinCE :: 랜카드를 이용한 ActvieSync    하창호 2006·10·31 4016
65  WinCE :: C++ .NET MFC에서 엑셀 파일 생성해서 편집하기    하창호 2006·07·28 7355
64  WinCE :: 모질라 CE 용 미니웹 브라우져 미니모    하창호 2006·07·24 5223
63  WinCE :: WinCE & XP Runtime license cost 및 ...  …4  하창호 2006·07·24 4609
62  WinCE :: MTD NAND Driver Programming Interfa...    하창호 2006·04·12 4211
61  WinCE :: 윈도우 CE 플래시 파일 시스템과 FTL    하창호 2006·04·12 5003
60  WinCE :: CE 5.0 에서의 PXA250용 BSP에 관해    하창호 2006·04·12 5066
59  WinCE :: Available Drivers for Windows CE    하창호 2006·04·12 4213
58  WinCE :: Lubbuck BSP for Windows CE 5.0    하창호 2006·04·12 4092
57  WinCE :: Intel PXA255 (Lubbuck) B/D용 Windows...    하창호 2006·04·12 4167
56  WinCE :: How to Migrate a Board Support Pack...    하창호 2006·04·12 4068
55  WinCE :: CE 5.0 Supported Board Support Pack...    하창호 2006·04·12 4063
54  WinCE :: How to Migrate a Windows CE .NET 4....    하창호 2006·04·12 4129
53  WinCE :: Supported BSPs    하창호 2006·04·12 4050
52  WinCE :: Windows CE 5.0의 그래픽 라이브러리를 사용한 GI...    하창호 2006·04·04 5166
51  WinCE :: USB WebCam Shared Source    하창호 2006·04·04 5556
50  WinCE :: vnc viewer ce    하창호 2005·10·23 5164
49  WinCE :: lucent orinico silver wince driver    하창호 2005·10·17 4238
48  WinCE :: 작업 표시줄 안보이게 세팅    하창호 2005·10·10 7675
47  WinCE :: 스타일러스 켈리브레이션 시작 함수    하창호 2005·10·10 4656
46  WinCE :: Available Drivers for Windows CE    하창호 2005·10·07 4047
45  WinCE :: EVC 와 ClearCase 연동시 문제 해결방법    하창호 2005·09·22 4625
44  WinCE :: WCE 에서 SetWindowOrg 처리의 대안 및 좌표계 ...    하창호 2005·09·22 5612
43  WinCE :: CE 에서 기본적으로 지원하는 무선랜카드 종류  …3  하창호 2005·08·25 5490
42  WinCE :: eVC 버그 DeleteObject() 및 포인터사용 관련    하창호 2005·08·16 4594
41  WinCE :: 메모리 상태 체크    하창호 2005·07·06 5052
40  WinCE :: 플렛폼 메니져 설치 오류 관련  …3  하창호 2005·06·19 4443
39  WinCE :: CE 에서 DIB 사용 방법 (CreateDIBSection 이...    하창호 2005·01·12 14140
38  WinCE :: EVC 4.0 에서 ON_EN_MAXTEXT 버그 있음    하창호 2004·12·27 4252
37  WinCE :: 쉘함수로 프로그램 띄우기 실행  …1  하창호 2004·12·02 4696
36  WinCE :: [TIP] 컨트롤 클래스의 타이머 On시 바운더리 클래...    하창호 2004·11·24 4271
35  WinCE :: 맥어드레스 알아내기    하창호 2004·11·16 6120
34  WinCE :: new로 할당할수 있는 메모리 크기확인 하는방법    하창호 2004·10·20 4341
33  WinCE :: PC용 ActiveX 컨트롤을 ce 3.0 용 ActiveX 컨...    하창호 2004·10·20 4216
 WinCE :: [펌CEFAN] WINCE 에서 DIB 의 사용    하창호 2004·10·18 9687
31  WinCE :: 이동식 디스크 찾는 방법 (편법임)  …2  하창호 2004·07·20 4934
30  WinCE :: 플랫폼 빌더 없이 SQL CE를 플랫폼에 설치하기    하창호 2004·06·22 5160
29  WinCE :: LNK2019 에러 처리 방법    하창호 2004·06·22 5816
28  WinCE :: 다이얼로그 에디터에서 보여지는 크기 비율    하창호 2004·06·22 4615
27  WinCE :: EVC 와 VC 용 코드를 호환성있게 쓰고 싶을 경우 쓰...    하창호 2004·06·21 4295
26  WinCE :: SQL CE 퍼포먼스 테스트 결과    하창호 2004·06·16 4240
25  WinCE :: [URL] Visual Studio .NET 및 Microsof...    하창호 2004·06·12 5439
24  WinCE :: 시작 메뉴바 감추기와 보이기    하창호 2004·06·02 6355
23  WinCE :: CE 에서 포터블 저장장치의 레지스트리 정보    하창호 2004·05·28 5204
22  WinCE :: WinCE 에서의 파일억세스  …3  하창호 2004·05·27 6334
21  WinCE :: ActiveSync는 되는데 StartUp Server 만 ...    하창호 2004·05·03 4184
1 [2]
   
Copyright 1999-2018 Zeroboard / skin by GGAMBO
....