C# 圖片畫素與毫米之間的轉換問題
接到一個活,要把匯入的圖片中任意兩點之間的水平距離和垂直距離求出來,一開始覺得這太容易了,也用得著做軟體?半個小時就搞定了,洋洋自得了一會兒突然發現……求出來的是畫素值,人家要的是毫米數,這才開始覺出問題。
在網上搜了半天,什麼裝置啊解析度啊顯示器什麼的都想過了,後來諮詢一朋友,人家被俺的白目給刺激到了,直接開啟photoshop圖片大小的介面截圖給我,告訴我……直接取圖片的DPI再換算就成了,於是恍然大悟,這和機器的顯示器解析度有個毛關係啊,圖片DPI才是王道啊。
嗯,具體過程如下:
private Point p1 = Point.Empty, p2 = Point.Empty;
//兩個點的座標
private double hd = 0, vd = 0; //水平距離和垂直距離
private float dpiX = 0, dpiY = 0; //圖片DPI值
private Bitmap curBitMap;
設定一個選擇圖片的按鈕,點選事件:
private void inputPictureButton_Click(object sender, EventArgs e)
{
OpenFileDialog fd = new OpenFileDialog();
fd.Title = "開啟圖片";
fd.DefaultExt = "jpg";
fd.Multiselect = false;
if (fd.ShowDialog() == DialogResult.OK)
{
try
{
curBitMap = (Bitmap)Image.FromFile(fd.FileName);
//取出圖片存入curBitMap
//取圖片水平DPI,比如是72,表示1畫素=1/72英寸,下同
dpiX = curBitMap.HorizontalResolution;
dpiY = curBitMap.VerticalResolution;
}
catch
{
MessageBox.Show("圖片讀取異常。", "系統提示");
return;
}
pictureBox1.Image = curBitMap;
horizontalTextbox.Text = string.Empty;
verticalTextBox.Text = string.Empty;
p1 = Point.Empty;
p2 = Point.Empty;
}
}
picturebox的Click事件,滑鼠在picturebox1中點選取座標值並計算距離:
private void pictureBox1_Click(object sender, EventArgs e)
{
if (p1 == Point.Empty)
{
//取滑鼠在控制元件內的座標,如直接用p1 = MousePosition取的是滑鼠在螢幕中的位置
p1 = this.pictureBox1.PointToClient(MousePosition);
}
else if (p2 == Point.Empty)
{
p2 = this.pictureBox1.PointToClient(MousePosition);
}
if (p1 != Point.Empty && p2 != Point.Empty)
{
hd = Math.Abs((p1.X - p2.X); //計算水平距離
vd = Math.Abs((p1.Y - p2.Y); //計算垂直距離
hd = hd * 25.4 / dpiX; //1英寸=25.4毫米,所以距離的毫米數=(畫素/DPI)*25.4
vd = vd * 25.4 / dpiY;
horizontalTextbox.Text = hd.ToString("F2"); //顯示距離,保留兩位小數
verticalTextBox.Text = vd.ToString("F2");
p1 = Point.Empty; //清空座標值
p2 = Point.Empty;
}
}
這是取圖片中的距離,如果和圖片無關,取螢幕上任意兩點的距離,就需要取顯示器的DPI的值,這個……有需要再研究。--