Pergunta

Eu estou olhando para converter pixes para polegadas e vice-versa. Eu entendo que eu preciso de DPI, mas não tenho certeza de como obter essa informação (por exemplo, eu não tenho o objeto Graphics, de modo que não é uma opção).

Existe uma maneira?

Foi útil?

Solução

Em um dispositivo de vídeo, qualquer resposta a esta pergunta é normalmente não muito precisos. O exemplo mais fácil de usar para ver porque este é o caso é um projetor. A resolução de saída é, digamos, 1024x768, mas o DPI varia de acordo com o quão longe a tela é do apeture projector. WPF, por exemplo, sempre assume 96 DPI em um aparelho de vídeo.

Supondo que você ainda precisa de uma resposta, independentemente da precisão, e você não tem um objeto Graphics, você pode criar um a partir do ecrã com algum P / Invoke e obter a resposta dela.

Single xDpi, yDpi;

IntPtr dc = GetDC(IntPtr.Zero);

using(Graphics g = Graphics.FromHdc(dc))
{
    xDpi = g.DpiX;
    yDpi = g.DpiY;
}

if (ReleaseDC(IntPtr.Zero) != 0)
{
    // GetLastError and handle...
}


[DllImport("user32.dll")]
private static extern IntPtr GetDC(IntPtr hwnd);    
[DllImport("user32.dll")]
private static extern Int32 ReleaseDC(IntPtr hwnd);

Outras dicas

Há, fisicamente, nenhuma maneira real, sem saber o DPI. Pixels são discretos, polegadas não são, se você está falando polegadas em seu monitor, você precisa saber (pelo menos) a resolução (e proporção de pixel) eo tamanho da área do monitor visível, a fim de calcular o seu DPI . A resolução é normalmente possível para buscar em algum lugar (eu não sou um C # ou .NET programador, por isso não posso ajudá-lo lá), mas o tamanho do monitor geralmente não está disponível. Se uma estimativa é bom o suficiente, então que o usuário digite o tamanho do monitor (ou seja, 21" ou qualquer outro) e resolver para DPI:

(resX/DPI)^2 + (resY/DPI)^2 = screenDiagonal^2

dando (supondo que você sabe o diagonal e resolução)

DPI = sqrt(resX^2+resY^2)/screenDiagonal

Esta é apenas uma estimativa, como monitores nunca são exatamente 21" (.. ou qualquer outro), e a proporção de pixel quase nunca é exatamente 1: 1.

Se você está falando polegadas em papel, em seguida, naturalmente você precisa saber o DPI da impressora (ou, mais precisamente, as configurações atuais da impressora).

Você pode criar o objeto Graphics simplesmente chamando this.CreateGraphics() (ou, mais geralmente Control.CreateGraphics()) e, em seguida, usar as propriedades DPix e DpiY como você parece saber. Basta lembrar de eliminar os gráficos objeto após sua criação (de preferência com uma declaração Usando).

Se você não estiver usando WinForms, então por favor deixe-nos saber que tipo de aplicação que é.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top