C# Windows 印表機在 203dpi 模式下 要如何知道每種字型當選擇特定大小時 每個字印在紙張來會實際多寬和多高
C# Windows 印表機在 203dpi 模式下 要如何知道每種字型當選擇特定大小時 每個字印在紙張來會實際多寬和多高
資料來源: 數個AI+自己
C#線上編譯: https://dotnetfiddle.net/ [最後是用VS測試]
GitHub:https://github.com/jash-git/CS_PrintDocument_ThermalPrinter
code:[第二個MeasureStringInMm 效能高; 原理寫在第一個MeasureStringInMm]
public class DPI_Funs
{
//---
//DPI 相關函數
//https://blog.csdn.net/wangnaisheng/article/details/139059374
public static void GetScreenDpi(out float DpiX, out float DpiY)//系統DPI
{
//Dots Per Inch(每英寸點數): 意思是指每一英吋長度中,取樣或可顯示或輸出點的數目
using (Graphics g = Graphics.FromHwnd(IntPtr.Zero))
{
DpiX = g.DpiX;
DpiY = g.DpiY;
}
}
public static float PixelsToInches(int pixels, float dpi)//像素 -> 英吋
{
return pixels / dpi;
}
public static float PixelsToMillimeters(int pixels, float dpi)//像素 -> 毫米
{
float inches = PixelsToInches(pixels, dpi);
return inches * 25.4f;
}
public static int MillimetersToPixels(float millimeters, float dpi)//毫米 -> 像素
{
float inches = millimeters / 25.4f;
return (int)(inches * dpi + 0.5f); // 使用0.5f进行四舍五入处理
}
//---
// 計算在指定 DPI 下,字串所佔據的實際寬度與高度。
public static SizeF MeasureStringInMm(string StrText, Font font, float fltDpi)//需要利用Dpi參數建一個虛擬畫布
{
// 檢查輸入是否有效,避免不必要的錯誤
if (string.IsNullOrEmpty(StrText) || font == null || fltDpi <= 0)
{
return SizeF.Empty;
}
// 建立一個 1x1 像素的虛擬 Bitmap 作為測量畫布
using (var bmp = new Bitmap(1, 1))
{
// 設定畫布的解析度為目標 DPI
bmp.SetResolution(fltDpi, fltDpi);
// 從畫布取得 Graphics 物件,此物件會繼承畫布的 DPI 設定
using (var g = Graphics.FromImage(bmp))
{
// 1. 測量字串在指定 DPI 下的像素尺寸
SizeF sizeInPixels = g.MeasureString(StrText, font);
// 2. 將像素尺寸轉換為公釐 (mm)
// 轉換公式: (像素 / DPI) * 25.4
float fltWidthInMm = PixelsToMillimeters((int)sizeInPixels.Width, fltDpi);// (sizeInPixels.Width / fltDpi) * 25.4f;
float fltHeightInMm = PixelsToMillimeters((int)sizeInPixels.Height, fltDpi);//(sizeInPixels.Height / fltDpi) * 25.4f;
// 3.使用熱敏印表機實際測試落差手動校正
fltWidthInMm -= 7;//在熱敏印表機實際測試得到參數
fltHeightInMm -= 0;//雖然字型Size要-2會比較剛好,但是當字型變小文字又會太黏 所以最後還是不做調整
// 4. 回傳包含公釐尺寸的 SizeF 物件
return new SizeF(fltWidthInMm, fltHeightInMm);
}
}
}
public static SizeF MeasureStringInMm(string StrText, Font font, Graphics g)//傳入印表機映射的畫布來進行運算
{
// 檢查輸入是否有效,避免不必要的錯誤
if (string.IsNullOrEmpty(StrText) || font == null || g == null)
{
return SizeF.Empty;
}
SizeF sizeInPixels = g.MeasureString(StrText, font);
// 2. 將像素尺寸轉換為公釐 (mm)
// 轉換公式: (像素 / DPI) * 25.4
float fltWidthInMm = PixelsToMillimeters((int)sizeInPixels.Width, g.DpiX);//(sizeInPixels.Width / g.DpiX) * 25.4f;
float fltHeightInMm = PixelsToMillimeters((int)sizeInPixels.Height, g.DpiX);//(sizeInPixels.Height / g.DpiY) * 25.4f;
// 3.使用熱敏印表機實際測試落差手動校正
fltWidthInMm -= 7;//在熱敏印表機實際測試得到參數
fltHeightInMm -= 0;//雖然字型Size要-2會比較剛好,但是當字型變小文字又會太黏 所以最後還是不做調整
// 4. 回傳包含公釐尺寸的 SizeF 物件
return new SizeF(fltWidthInMm, fltHeightInMm);
}
//---計算在指定 DPI 下,字串所佔據的實際寬度與高度。
//---DPI 相關函數
}
One thought on “C# Windows 印表機在 203dpi 模式下 要如何知道每種字型當選擇特定大小時 每個字印在紙張來會實際多寬和多高”
C# Windows 印表機在 203dpi 模式下 要如何取得每種字型當選擇特定大小時 每個字印在紙張來會實際多寬和多高
C# Windows 印表機在 203dpi 模式下 要如何抓取每種字型當選擇特定大小時 每個字印在紙張來會實際多寬和多高