如何以英寸为单位设置图像的高度和宽度
本文关键字:高度 图像 设置 为单位 | 更新日期: 2023-09-27 18:01:24
我试图从字符串保存图像。
所以我想知道如何在保存图像时以英寸为单位设置图像的高度和宽度
保存图像的代码如下:
private void Base64ToImage(string base64String)
{
Image fullSizeImg = null;
byte[] imageBytes = Convert.FromBase64String(base64String);
MemoryStream ms = new MemoryStream(imageBytes);
fullSizeImg = Image.FromStream(ms, true);
System.Drawing.Image.GetThumbnailImageAbort dummyCallBack = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
System.Drawing.Image thumbNailImg = fullSizeImg.GetThumbnailImage(700, 800, dummyCallBack, IntPtr.Zero);
thumbNailImg.Save(ImagePath, System.Drawing.Imaging.ImageFormat.Png);
fullSizeImg.Dispose();
thumbNailImg.Dispose();
}
不行。我们以像素保存,因为一英寸/厘米/英里不能转换为屏幕上的实际面积。这样做的原因是我们都使用不同的DPI设置,尽管92 DPI似乎是当今更常见的设置之一。
打印机也有不同的DPI设置…
要从英寸计算像素,您可以尝试:
pixels = inches * someDpiSetting
但请记住,这不会导致每个屏幕,每个打印输出等的英寸。
编辑:如果你看一下WPF,你会发现它对DPI有很好的支持,不管DPI是什么,它都会把表单翻译成相同的大小。也许这有帮助?
位图没有以英寸为单位的大小,它们的大小以像素为单位。也就是说,大多数现代位格式都有一个称为DPI(每英寸点数)的元数据,用于通过简单的公式将像素大小转换为英寸大小:
inches = pixels / dpi
对于Image类,您使用SetPropertyItem方法设置元数据,其中我们感兴趣的元数据片段是:
-
PropertyTagResolutionUnit
-将其设置为"2",表示英寸 -
PropertyTagXResolution
-本质上是X DPI,只要PropertyTagResolutionUnit
是英寸。 -
PropertyTagYResolution
-只要PropertyTagResolutionUnit
以英寸为单位,Y DPI
详细信息请参见属性项描述。
(实际上,我在写这篇文章的过程中意识到,使用SetPropertyItem
设置属性元数据看起来真的很复杂-您可能只是更好地使用Bitmat,它具有分辨率属性,使整个事情变得容易得多)
与那些英制单位和公式式单位相比:
// inches = pixels / dpi
// pixel = inches * dpi
// 1 centimeter = 0.393700787 inch
// pixel = cm * 0.393700787 * dpi
single sngWidth = 2.25; //cm
single sngHeight = 1.0; //cm
sngWidth *= 0.393700787 * bmpImage.HorizontalResolution; // x-Axis pixel
sngHeight *= 0.393700787 * bmpImage.VerticalResolution; // y-Axis pixel
一样:
public static int Cm2Pixel(double WidthInCm)
{
double HeightInCm = WidthInCm;
return Cm2Pixel(WidthInCm, HeightInCm).Width;
} // End Function Cm2Pixel
public static System.Drawing.Size Cm2Pixel(double WidthInCm, double HeightInCm)
{
float sngWidth = (float)WidthInCm; //cm
float sngHeight = (float)HeightInCm; //cm
using (System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(1, 1))
{
sngWidth *= 0.393700787f * bmp.HorizontalResolution; // x-Axis pixel
sngHeight *= 0.393700787f * bmp.VerticalResolution; // y-Axis pixel
}
return new System.Drawing.Size((int)sngWidth, (int)sngHeight);
} // End Function Cm2Pixel
如果你正在使用位图,那么它有SetResolution
(http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.setresolution.aspx)方法,允许你设置x和y dpi,这可以很容易地从你已经知道的图像的高度和宽度的像素和英寸中得出。
我希望这里使用位图而不是图像不应该是一个问题。它是一个子类,所以我想你可以。
MemoryStream ms = new MemoryStream();
new FileStream(Afiladdress, FileMode.Open).CopyTo(ms);
Bitmap myimage = new Bitmap(ms);
float Width = myimage.Width / myimage.HorizontalResolution;//in INCHES
float Height= myimage.Height/ myimage.VerticalResolution;//in INCHES