我正在尝试从字符串中保存图像。
所以我想知道如何在保存图像时以英寸为单位设置图像高度和宽度。
我的代码遵循图像保存:
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();
}
答案 0 :(得分:8)
这不起作用。我们以像素为单位保存,因为英寸/厘米/英里不会转换为屏幕上的空间。这样做的原因是我们都使用不同的DPI设置,虽然92 DPI似乎是当今比较常见的设置之一。
打印机也有不同的DPI设置......
要从英寸计算像素,您可以尝试:
pixels = inches * someDpiSetting
但请记住,这不会导致每个屏幕上的英寸,每个打印输出等等。
编辑:如果你看看WPF,你会发现它对DPI有很好的支持,并且无论DPI如何,都会将表格转换为相同(给予或接受)的大小。也许这有帮助吗?
答案 1 :(得分:4)
位图没有以英寸为单位的大小,其大小以像素为单位。也就是说,大多数现代比特币格式都有一个称为DPI(每英寸点数)的元数据,用于通过简单的公式将像素大小转换为英寸大小:
inches = pixels / dpi
对于Image类,您使用SetPropertyItem Method 设置元数据,其中我们感兴趣的元数据是:
PropertyTagResolutionUnit
- 将此设置为“2”(英寸)PropertyTagXResolution
- 基本上是X DPI,只要PropertyTagResolutionUnit
以英寸为单位。PropertyTagYResolution
- Y DPI只要PropertyTagResolutionUnit
以英寸为单位有关详细信息,请参阅Property Item Descriptions。
(实际上,我在写这篇文章的过程中意识到使用SetPropertyItem
设置属性元数据看起来非常复杂 - 你可能最好使用Bitmat代替它,它具有分辨率属性使得整体事情好多了很多)
答案 2 :(得分:2)
如果您使用的是Bitmap,那么它的方法SetResolution
(http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.setresolution.aspx)允许您设置x和y dpi,这可以通过您对高度和宽度的了解轻松得出。你已经拥有的像素和英寸的图像。
我希望在这里使用Bitmap而不是Image应该不是问题。它是一个子类,所以我想你很可能。
答案 3 :(得分:2)
与那些帝国措施和仅限公式的对比:
// 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
答案 4 :(得分:0)
> data.table::setDT(dt)
> dcast.data.table(dt,var1~var2,value.var = "var3")
var1 1 2 3 4 6
1: 1 10 20 30 NA NA
2: 2 NA 10 NA 20 30