Ich arbeite an einem Migrationsprojekt, in dem eine Datenbank tatsächlich Displaygrößen in Twips speichert. Da ich Twips nicht verwenden kann, um WPF- oder Winforms-Steuerelementen Größen zuzuweisen, habe ich mich gefragt, ob .NET eine zur Laufzeit verwendbare Konvertierungsmethode hat?Wie konvertiere ich Twips zu Pixel in .NET?
Antwort
Es stellt sich heraus, dass das Migrationstool etwas hat, aber es würde zur Laufzeit nicht gut tun. Hier ist, was ich getan habe (wenn der hartcodierte Wert in der Erweiterungsmethode auf den Wert für Punkte pro Zoll geändert wurde, würde es auch als Punktkonverter funktionieren):
1 Twip = 1/1440. eines Zolls. Das Objekt .NET Graphics
verfügt über eine Methode DpiX
und DpiY
, die verwendet werden kann, um festzustellen, wie viele Pixel in einem Zoll sind. diese Messungen verwenden habe ich die folgenden Erweiterungsmethoden für 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);
}
}
diese Methoden verwenden man einfach die folgende (vorausgesetzt, Sie in einem Kontext sind zu tun hat, wo CreateGraphics
ein Drawing.Graphics
Objekt zurückgibt (hier this
ist ein Form, so wird CreateGraphics
geerbt von Form
‚s Super-Klasse Control
):
using(Graphics g = CreateGraphics())
{
Width = g.ConvertTwipsToXPixels(sizeInTwips);
Height = g.ConvertTwipsToYPixels(sizeInTwips);
}
Siehe Abschnitt "Hinweise" in den Graphics
Class documentation für eine Liste von Möglichkeiten, um eine grafische Darstellung zu erhalten ics-Objekt. Eine ausführlichere Dokumentation finden Sie im Tutorial How to: Create Graphics Objects.
Kurze Zusammenfassung der einfachsten Möglichkeiten:
Control.CreateGraphics
- ein
PaintEventArgs
Paint Ereignis hat eineGraphics
in seinerGraphics
Eigenschaft. - Hand
Graphics.FromImage
ein Bild und es wird einGraphics
Objekt zurückgegeben, das auf diesem Bild zeichnen kann. (Hinweis: Es ist unwahrscheinlich, dass Sie twips für ein aktuelles Bild verwenden werden wollen)
hat einen kleinen Fehler in Ihrem Code. In den ConvertTwipsToYPixles, haben Sie es mit dem DipX anstelle des DpiY – Wesley
@ downvoter ??? Möchten Sie das erklären? – Crisfole
danke, ich habe eine andere Frage. Sie haben gesagt, dass CreateGraphics ein Drawing.Graphics-Objekt zurückgibt. Welche Art von Grafiken gibt es zurück? Können Sie bitte ein Beispiel für die CreateGraphics-Methode geben? –
als Referenz, eine andere C# Version, mit dem Win32-API statt erfordern ein Graphics
Objekte:
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
}
Die MeasureDirection
soll angegeben werden, da es keine Garantie gibt, dass Pixel immer quadratisch sind (gemäß der kb).
+1 für eine Grafik-Kontext-freie Möglichkeit, dies zu tun. – Crisfole
Für Migrationsprojekte können wir in converstion Support-Funktionen gebaut werden, benutzen
microsoft.visualbasic.compatibility.vb6.twipsperpixelx
microsoft.visualbasic.compatibility.vb6.twipsperpixely
Alte Post Ich weiß, aber hier ist ein FYI und einige Mathematik für die 1440 Antworten oben ...
Ein twip ist nicht einfach 1/1440
th von einem Zoll. Ein Twip ist 1/20
eines Punkt.
Der Punkt, den Sie mit in ein druckbares Dokument arbeiten, ist in der Regel ein Nachsatz:
72dpi. 72dpi * 20Twips/Point = 1440twips
.
Also im Umgang mit sagen, ein Crystal Reports-Bericht, mit einer Breite von twips 15840
(und Margen von 0 twips), die Breite 11 inches (15840/(72 * 20))
wäre.
auf einem Bildschirm Dichte von 96 dpi Basierend, wird der Bericht auf dem Bildschirm schreiben an:
1056px wide (96dpi * 11in = 1056px)
.
nur für alle Ihre Informationen, die Infragistics verwenden Ein Zoll entspricht 1440 twips (zwanzigstel eines Desktop-Punkt). Ein Zoll entspricht 72 Desktop-Punkten. Quelle: http://help.infragistics.com/Help/Doc/WinForms/2016.1/CLR4.0/html/Infragistics4.Documents.IO.v16.1~Infragistics.Documents.Word.WordDocumentWriter~ConvertUnits.html – Syed
- 1. Wie konvertiere ich das Bild in 2-Bit pro Pixel?
- 2. Konvertiere lat/lon in Pixel und zurück
- 3. Wie konvertiere ich ein CGImage zu CMSampleBufferRef?
- 4. Pixel-zu-Pixel-Transformation
- 5. Wie konvertiere ich eine Höhe eines in vh angegebenen Elements in Pixel?
- 6. PSD Pixel zu IOS Punkte
- 7. Wie konvertiere ich HTML in RTF (Rich Text) in .NET, ohne für eine Komponente zu bezahlen?
- 8. Wie konvertiere ich Scope_Identity() zu Int?
- 9. Wie konvertiere ich LF zu CRLF?
- 10. Wie konvertiere ich von NSString zu NSDate?
- 11. Wie konvertiere ich Datetime zu Timestamp Epoch
- 12. Wie konvertiere ich DiffTime zu NominalDiffTime?
- 13. Wie konvertiere ich eine PCRE zu EBNF?
- 14. Wie konvertiere ich eine Menge von Polygonen in eine Bitmap?
- 15. Wie konvertiere ich von BLOB zu TEXT in MySQL?
- 16. Wie konvertiere ich ein Byte-Array zu Base64 in Java?
- 17. Wie konvertiere ich einen CString zu einem Doppel in C++?
- 18. Wie konvertiere ich ZoneId zu DateTimeZone in Java
- 19. Wie konvertiere ich Byte-Array zu Bild in Javascript
- 20. Wie konvertiere ich mehrere innere Joins in SQL zu LINQ?
- 21. Wie konvertiere ich von Stringstream zu String in C++?
- 22. Wie konvertiere ich von Zeitstempel zu Datum in Python?
- 23. Wie konvertiere ich ein Array zu einem Hash in Perl?
- 24. Pixel pro Pixel Bild, transparent zu schwarz
- 25. Wie dicom Pixel in C++ zu lesen
- 26. Wie Pixel-Bearbeitung in Leinwand zu optimieren
- 27. Wie konvertiere ich NaN in eine 0?
- 28. Wie konvertiere ich ein Datum in YYYYMMDD?
- 29. Wie konvertiere ich diese Unterabfrage in Linq?
- 30. Wie konvertiere ich 2.0E-6 in 0.00000200?
https://www.unitconverters.net/typography/twip-to-pixel-x.htm sagt 1 Pixel = 15 twips ==> 1 twips = 1/15 px – Syed