2011-02-25 6 views
3

Dpi 점은 응용 프로그램이 실행되는 디스플레이의 픽셀과 어떤 관련이 있습니까?DPI 그래픽 화면 해상도 픽셀 WinForm PrintPageEventArgs

int points; 
Screen primary; 

public Form1() { 
    InitializeComponent(); 
    points = -1; 
    primary = null; 
} 

void OnPaint(object sender, PaintEventArgs e) { 
    if (points < 0) { 
    points = (int)(e.Graphics.DpiX/72.0F); // There are 72 points per inch 
    } 
    if (primary == null) { 
    primary = Screen.PrimaryScreen; 
    Console.WriteLine(primary.WorkingArea.Height); 
    Console.WriteLine(primary.WorkingArea.Width); 
    Console.WriteLine(primary.BitsPerPixel); 
    } 
} 

이제 모든 정보가 필요합니까?

위의 정보 중 하나를 사용하여 1200 픽셀의 길이를 확인할 수 있습니까?

+0

참고 : 양식을 보편적으로 표시하는 방법을 배우게되면 해당 양식의 데이터가 프린터로 전송되므로 제목의 'PrintPageEventArgs'가 전송됩니다. – jp2code

답변

1

는 나는 몇 달 이었지만 WPF에 책을 읽는 동안, 나는 대답을 가로 질러왔다 실현 실제, 실제 픽셀.

[Physical Unit Size] = [Device-Independent Unit Size] x [System DPI] 
        = 1/96 inch x 96 dpi 
        = 1 pixel 

따라서 96 픽셀은 Windows 시스템 DPI 설정을 통해 1 인치를 만듭니다.

그러나 실제로는 디스플레이 크기에 따라 다릅니다. 1600 × 1200의 해상도로 설정 19 인치 LDC 모니터

, 피타고라스 정리를 사용하여 모니터에 대한 픽셀 밀도를 계산하는 데 도움이 :

[Screen DPI] = Math.Sqrt(Math.Pow(1600, 2) + Math.Pow(1200, 2))/19 

이 데이터를 사용하여, 나는 약간의 정적을 썼다 도구 지금 내 모든 프로젝트의 도구 클래스에 보관하십시오.

/// <summary> 
/// Calculates the Screen Dots Per Inch of a Display Monitor 
/// </summary> 
/// <param name="monitorSize">Size, in inches</param> 
/// <param name="resolutionWidth">width resolution, in pixels</param> 
/// <param name="resolutionHeight">height resolution, in pixels</param> 
/// <returns>double presision value indicating the Screen Dots Per Inch</returns> 
public static double ScreenDPI(int monitorSize, int resolutionWidth, int resolutionHeight) { 
    //int resolutionWidth = 1600; 
    //int resolutionHeight = 1200; 
    //int monitorSize = 19; 
    if (0 < monitorSize) { 
    double screenDpi = Math.Sqrt(Math.Pow(resolutionWidth, 2) + Math.Pow(resolutionHeight, 2))/monitorSize; 
    return screenDpi; 
    } 
    return 0; 
} 

다른 사람들이이 멋진 도구를 사용하기를 바랍니다.

3

DPI는 "인치당 도트 수"- 문자 수 == 픽셀을 의미합니다. 그래서 시간을 1200 픽셀 결정하는 것은 : 화면에 대한

int inchesLong = (1200/e.Graphics.DpiX); 
+0

비디오 dpi 설정이 정확하지 않습니다. 모니터 크기에 관계없이 96 또는 120 또는 144로 고정됩니다. –

+0

@Hans 사실이 아닙니다. 예를 들어 192DPI로 앱을 테스트했습니다. 그것은 꽤 펑키하게 보입니다,하지만 괜찮습니다. –

+0

@David - 해당 dpi 설정과 일치하는 다른 모니터를 구입 했습니까? 인치 측정을 동일하게하는 데 필요합니다. –

1

: 픽셀 = Graphics.DpiY * 점/질문 제목에 언급 된 프린터, 매핑 1 '픽셀'입니다 들어

(72) = = 기본적으로 0.010 인치. 이것은 인치 당 96 도트의 기본 비디오 dpi에 매우 가깝습니다. 복사본을 종이에 복사하여 모니터에서 보는 것과 같은 크기로 만듭니다.

양식을 스크린 샷으로 만들어 인쇄하는 것은 좋지 않습니다. 프린터의 해상도는 훨씬 높으며 일반적으로 600dpi입니다. 화면의 각 픽셀이 종이에 6x6 크기로 나타날 때 인쇄물이 거칠게 보입니다. 특히 앤티 앨리어싱 텍스트의 경우 눈에 띄고 추악합니다.

표준 Windows DPI 설정 (96 dpi로)를 사용하는 경우는, 각각의 장치 독립적 단위 하나에 해당

+0

실제로 양식은 프린터로 보내기 전에 데이터의 '인쇄 미리보기'를 표시하기위한 것입니다. 프로젝트는 모든 데이터를 프린터로 보낼 때 양식으로 그려야합니다. 진흙으로 맑습니까? :) – jp2code

+1

참으로 진흙 투성이. 필요한 작업이없는 PrintPreviewDialog를 사용하십시오. –

+0

그러나 처음에는 닭이나 계란이 왔습니까? LOL - MS의 PrintPreviewDialog를 사용하기 전에 객체를 무언가에 페인트해야합니다. – jp2code