2010-10-28 20 views
22

Tôi đang làm việc trên một dự án di chuyển trong đó cơ sở dữ liệu thực sự lưu trữ kích thước màn hình theo twips. Vì tôi không thể sử dụng twips để gán kích thước cho WPF hoặc điều khiển Winforms, tôi đã tự hỏi nếu NET có một phương pháp chuyển đổi có thể sử dụng trong thời gian chạy?Làm cách nào để chuyển đổi Twips thành Pixels trong .NET?

+0

https://www.unitconverters.net/typography/twip-to-pixel-x.htm cho biết 1 Pixel = 15 twips ==> 1 twips = 1/15 px – Syed

Trả lời

26

Nó chỉ ra rằng công cụ di chuyển có một cái gì đó, nhưng nó sẽ không làm bất kỳ tốt lúc chạy. Dưới đây là những gì tôi đã làm (nếu giá trị mã hóa cứng trong phương pháp mở rộng đã được thay đổi thành giá trị cho mỗi điểm, nó cũng hoạt động như một công cụ chuyển đổi điểm):

1 Twip = 1/1440th của inch. Đối tượng .NET Graphics có phương thức DpiXDpiY có thể được sử dụng để xác định số lượng pixel trong một inch. Sử dụng những phép đo tôi tạo ra các phương pháp khuyến nông sau cho Graphics:

using System.Drawing; 

static class Extensions 
{ 
    /// <summary> 
    /// Converts an integer value in twips to the corresponding integer value 
    /// in pixels on the x-axis. 
    /// </summary> 
    /// <param name="source">The Graphics context to use</param> 
    /// <param name="inTwips">The number of twips to be converted</param> 
    /// <returns>The number of pixels in that many twips</returns> 
    public static int ConvertTwipsToXPixels(this Graphics source, int twips) 
    { 
     return (int)(((double)twips) * (1.0/1440.0) * source.DpiX); 
    } 

    /// <summary> 
    /// Converts an integer value in twips to the corresponding integer value 
    /// in pixels on the y-axis. 
    /// </summary> 
    /// <param name="source">The Graphics context to use</param> 
    /// <param name="inTwips">The number of twips to be converted</param> 
    /// <returns>The number of pixels in that many twips</returns> 
    public static int ConvertTwipsToYPixels(this Graphics source, int twips) 
    { 
     return (int)(((double)twips) * (1.0/1440.0) * source.DpiY); 
    } 
} 

Để sử dụng những phương pháp này một cách đơn giản có phải làm như sau (giả sử bạn đang ở trong một bối cảnh nơi CreateGraphics trả về một đối tượng Drawing.Graphics (đây là một this Mẫu, vì vậy CreateGraphics được thừa hưởng từ siêu lớp Form 's Control):

using(Graphics g = CreateGraphics()) 
{ 
    Width = g.ConvertTwipsToXPixels(sizeInTwips); 
    Height = g.ConvertTwipsToYPixels(sizeInTwips); 
} 

Hãy xem phần 'Ghi chú' phần trong Graphics Class documentation cho một danh sách các cách để có được một đồ thị đối tượng ics. Tài liệu hoàn chỉnh hơn có sẵn trong hướng dẫn How to: Create Graphics Objects.

tóm tắt ngắn gọn về những cách dễ nhất:

  • Control.CreateGraphics
  • một sự kiện sơn của PaintEventArgsGraphics sẵn trong tài sản Graphics của nó.
  • Tay Graphics.FromImage một hình ảnh và nó sẽ trả về đối tượng Graphics có thể vẽ trên hình ảnh đó. (Chú ý: Nó không chắc rằng bạn sẽ muốn sử dụng twips cho một hình ảnh thực tế)
+2

gặp lỗi nhỏ trong mã của bạn. Trong ConvertTwipsToYPixles, bạn có nó bằng cách sử dụng DipX thay vì DpiY – Wesley

+0

@downvoter ??? Quan tâm để giải thích? – Crisfole

+0

cảm ơn, tôi có một câu hỏi khác. Bạn nói rằng CreateGraphics trả về một đối tượng Drawing.Graphics. Những loại đồ họa nó trả về? Bạn có thể đưa ra một ví dụ về phương pháp CreateGraphics không? –

3

Để tham khảo, một phiên bản C#, sử dụng API Win32 thay vì đòi hỏi một Graphics đối tượng:

using System.Runtime.InteropServices; 

static class SomeUtils { 

    public static int ConvertTwipsToPixels(int twips, MeasureDirection direction) { 
    return (int)(((double)twips)*((double)GetPixperinch(direction))/1440.0); 
    } 

    public static int ConvertPixelsToTwips(int pixels, MeasureDirection direction) { 
    return (int)((((double)pixels)*1440.0)/((double)GetPixperinch(direction))); 
    } 

    public static int GetPPI(MeasureDirection direction) { 
    int ppi; 
    IntPtr dc = GetDC(IntPtr.Zero); 

    if (direction == MeasureDirection.Horizontal) 
     ppi = GetDeviceCaps(dc, 88); //DEVICECAP LOGPIXELSX 
    else 
     ppi = GetDeviceCaps(dc, 90); //DEVICECAP LOGPIXELSY 

    ReleaseDC(IntPtr.Zero, dc); 
    return ppi; 
    } 

    [DllImport("user32.dll")] 
    static extern IntPtr GetDC(IntPtr hWnd); 

    [DllImport("user32.dll")] 
    static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDC); 

    [DllImport("gdi32.dll")] 
    static extern int GetDeviceCaps(IntPtr hdc, int devCap); 
} 

public enum MeasureDirection { 
    Horizontal, 
    Vertical 
} 

MeasureDirection được cho là được chỉ định vì không có gì đảm bảo rằng pixel luôn vuông (theo kb).

tham khảo: kb210590: ACC2000: How to Convert Twips to Pixels

+0

+1 để biết cách xử lý ngữ cảnh không có đồ họa. – Crisfole

4

Đối với dự án di dân, chúng tôi có thể sử dụng được xây dựng trong các chức năng hỗ trợ converstion

microsoft.visualbasic.compatibility.vb6.twipsperpixelx 
microsoft.visualbasic.compatibility.vb6.twipsperpixely 
2

Cũ bài Tôi biết nhưng đây là một vài công thức FYI và cho 1440 câu trả lời ở trên ...

Một cành cây không đơn giản là 1/1440 th/inch. Một sợi dây là 1/20 của một điểm.

Điểm bạn đang làm việc với trong một tài liệu có thể in được, thông thường, là một postscript:

72dpi. 72dpi * 20Twips/Point = 1440twips.

Vì vậy, trong giao dịch với một báo cáo Crystal, với chiều rộng twips là 15840 (và lề của 0 twips), chiều rộng sẽ là 11 inches (15840/(72 * 20)).

Dựa trên mật độ màn hình 96 dpi, báo cáo sẽ gửi đến màn hình tại địa chỉ:

1056px wide (96dpi * 11in = 1056px).

+0

chỉ dành cho tất cả thông tin của bạn đang sử dụng Infragistics Một inch bằng 1,440 twips (hai mươi điểm của một điểm trên máy tính để bàn). Một inch bằng 72 điểm trên máy tính để bàn. Nguồn: http://help.infragistics.com/Help/Doc/WinForms/2016.1/CLR4.0/html/Infragistics4.Documents.IO.v16.1~Infragistics.Documents.Word.WordDocumentWriter~ConvertUnits.html – Syed

Các vấn đề liên quan