2011-10-17 2 views
0

이미지 데이터를 나타내는 클래스가 있습니다. 그들은 다양한 기본 구조를 가지고 있지만 모두 i, j 번째 이미지 요소를 반환하는 색인 ​​된 속성을가집니다. 그런 이미지를 폼에 표시해야합니다. 지금은 System.Drawing.Bitmap으로 사전 변환 한 다음 표준 Winforms PictureBox에 표시합니다. 내 생각은 내 이미지 형식의 속성을 가진 사용자 지정 컨트롤을 만들고 그림을 System.Drawing.Bitmap 또는 System.Drawing.Image으로 예비 변환하지 않고 표시합니다.이미지 표시를위한 사용자 정의 컨트롤

이 문제의 단서는 사용자가 그려주는 컨트롤을 만들고 거기에 OnPaint 이벤트를 무시하는 것입니다.

protected override void OnPaint(PaintEventArgs e) 
    { 
     for(int i=e.ClipRectangle.Left; i<=e.ClipRectangle.Right; i++) 
     { 
      for (int j = e.ClipRectangle.Top; j <= e.ClipRectangle.Bottom; j++) 
      { 
       //do something with i and j here 
       //calculate the corresponding k and l indices 
       //assign _myCustomClassImage[k,l] somewhere 
      } 
     } 

    } 

예, 나는 클립 사각형의 크기의 비트 맵을 생성하고 그것의 요소를 할당와 setPixel를 사용하지만와 setPixel 매우 느리게 작동 할 수 있음을 이해합니다.

또 다른 아이디어는 마샬링을 사용하여 비트 맵의 ​​픽셀을 지정하는 것이지만, OnPaint 이벤트 처리기 내에 비트 맵을 만드는 것에 대한 아이디어는 매우 불충분합니다.

내 작업을 계속해야하는 방향에 대한 제안이 있습니까?

답변

1

사용자 정의 컨트롤을 만들고 OnPaint 메서드를 재정의하면 표시 할 데이터가 어떤 식 으로든 벡터 방식으로 된 경우 유용합니다. 표시 할 이미지가있는 경우 Bitmap 객체를 만드는 것보다 더 좋은 대안이 아닌 것 같습니다.

SetPixel이 느리고 '비트 맵의 ​​픽셀 할당을 위해 마셜링 사용'이 무엇인지 모르겠지만 System.Drawing.Imaging.BitmapData 클래스와 Bitmap.LockBits 메서드를 사용하는 빠른 대안이 있습니다. 사용 예제 here을 참조하십시오.

그런데 왜 OnPaint 메서드에서 Bitmap 개체를 만들어야합니까? 한 번만 생성하고 할당하지 않습니까?

+0

예, 정확하게 BitmapData를 사용하는 방법을 의미했습니다. System.Runtime.InteropServices.Marshal.Copy 메서드를 사용하여 관리되는 배열을 BitmapData에 복사 할 수 있습니다. –

+0

예, 한 번 비트 맵을 만들고 할당하는 것만으로 충분하지만, 제가 원했던 것은 비트 맵을 전혀 작성하지 않는 것입니다. 내 데이터를 비트 맵에 복사 한 다음 그 데이터를 사용하여 그리면 중복 솔루션처럼 보입니다. –