2012-07-20 3 views
4

픽셀 단위가 아닌 다른 단위로 GetBounds에서 사각형을 다시 얻는 방법을 알려줄 수 있습니까? 다음 코드는이 함수에 대해 MSDN 설명서에서 직접 해제 한 것으로 포인트 (1/72 인치) 대신 픽셀로 표시된 사각형을 반환합니다. (아이콘이 32/72 "x32/72"가 아니라 32x32 픽셀이 아닌 한). 저는 직사각형을 인치로 사용하는 것에 가장 관심이 있습니다. 그러나 GetBounds pageUnit 매개 변수가 반환 된 사각형의 변경을 일으키는 것을 확인하는 것으로 해결할 것입니다.System.Drawing.Bitmap GetBounds GraphicsUnit.Inch

Bitmap bitmap1 = Bitmap.FromHicon(SystemIcons.Hand.Handle); 
Graphics formGraphics = this.CreateGraphics(); 
GraphicsUnit units = GraphicsUnit.Point; 

RectangleF bmpRectangleF = bitmap1.GetBounds(ref units); 
Rectangle bmpRectangle = Rectangle.Round(bmpRectangleF); 
formGraphics.DrawRectangle(Pens.Blue, bmpRectangle); 
formGraphics.Dispose(); 
+1

선언의 버그입니다. 인수는 * ref *가 아닌 * ref *입니다. 가장 좋은 방법은 Width/Height를 사용하는 것입니다. –

+0

아니요, 'out'키워드를 사용하려고하면 오류가 발생합니다. 단위를 변환하는 데 거의 어려움이 없지만 작동하면 더 쉬울 것입니다. –

답변

4

정보는 내가 비트 맵이 이미 단위가 이미 설정 및 변하기 쉬워없는 한 생성되기 때문에 제안이 MSDN Forum posting을 찾을 수 있었다 이것에 약간의 스파 스입니다. GraphicsUnit이 참조로 전달 되었기 때문에 통화 후 전화를 보면 Pixel에서 Inch으로 다시 설정됩니다. 실제로 사각형을 그리는 크기를 변경하려면 Graphics.PageUnit PropertyformGraphics을 입력하고 GraphicsUnit에 사각형을 그릴 수 있습니다. 위의 링크에서

: 비트 맵의 ​​바인딩이 결정 되었기 때문에이 샘플에서

는 Image.GetBounds 방법의 매개 변수는 결과를 변경하지 마십시오. 매개 변수는 범위를 처리 할 단위 길이 (인치 단위 또는 점 단위) 만 결정합니다. 그러나 매개 변수 은 결과에 영향을 미치지 않습니다.

강조 광산

+0

예제에서 사용 된 이미지가 하드 코딩되어 있고이 이미지의 단위를 알고있을 때 MSDN 문서 예제가 '점'으로 명시 적으로 장치를 초기화하지 않는다는 것은 의미가 없습니다. 또한 GetBounds 메서드에 대한 doc은 다음과 같이 설명합니다. 지정된 단위로 이미지의 경계를 가져옵니다. 거의 확실히 (nother) GDI + 버그입니다. 해상도를 알고있는 단위를 변환하는 데 아무런 문제가 없지만 큰 이미지가있는 버그를 발견하고 포기하고 대신 WPF를 사용하기 시작했습니다. –

1

약간 늦게 응답이 하나,하지만 난 구글에서 그것을 발견하기 때문에 "몇 mm 내 그림 상자를에 들어갈 수있는 질문에 대답 할 때 나는 그렇게 할 것이라고 생각? "그것은 그것을하는 방법을 해결할 필요가없는 많은 시간을 저축했을 것입니다. 도로 getBounds 쓸모가 (당신이 ... 픽셀을 원하는 경우)하지만 Graphics.TransformPoints 방법을 사용하여 도면 단위와 표시 화소 사이의 관계를 찾을 수 있습니다 :

private void Form1_Load(object sender, EventArgs e) 
    { 
     Bitmap b; 
     Graphics g; 
     Size s = pictureBox1.Size; 
     b = new Bitmap(s.Width, s.Height); 
     g = Graphics.FromImage(b); 
     PointF[] points = new PointF[2]; 
     g.PageUnit = GraphicsUnit.Millimeter; 
     g.PageScale = 1.0f; 
     g.ScaleTransform(1.0f, 1.0f); 
     points[0] = new PointF(0, 0); 
     points[1] = new PointF(1, 1); 
     g.TransformPoints(CoordinateSpace.Device, CoordinateSpace.Page, points); 
     MessageBox.Show(String.Format("1 page unit in {0} is {1} pixels",g.PageUnit.ToString(),points[1].X)); 
     points[0] = new PointF(0, 0); 
     points[1] = new PointF(1, 1); 
     g.TransformPoints(CoordinateSpace.Page, CoordinateSpace.World, points); 
     MessageBox.Show(String.Format("1 page unit in {0} is {1} pixels",g.PageUnit.ToString(),points[1].X)); 
     g.ResetTransform(); 
     pictureBox1.Image = b; 
     SolidBrush brush = new SolidBrush(Color.FromArgb(120, Color.Azure)); 
     Rectangle rectangle = new Rectangle(10, 10, 50, 50); 
     // Fill in the rectangle with a semi-transparent color. 
     g.FillRectangle(brush, rectangle); 
     pictureBox1.Invalidate(); 

    } 

이 표시 할 기본 mm를 표시됩니다 픽셀 (3.779527 내 경우) - 세계 좌표는 픽셀 당 1mm이며, 그래픽을 적용하면 변경됩니다 .ScaleTransform.

편집 : 물론 비트 맵을 pictureBox 이미지 속성에 할당하고 필요에 따라 변경할 수 있도록 그래픽 개체를 유지하면 도움이됩니다.