如何设置图像的高度和宽度(英寸)?

时间:2011-07-06 10:22:30

标签: c#

我正在尝试从字符串中保存图像。

所以我想知道如何在保存图像时以英寸为单位设置图像高度和宽度。

我的代码遵循图像保存:

 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();


    }

5 个答案:

答案 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,那么它的方法SetResolutionhttp://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