开发者

How to set images height and width in inches?

I am trying to save an image from string.

so I want to know how I can set image height and width in inches at the time of saving the image.

my code follows for image saving :

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


    }


That doesn't work. We save in pixels because an inch/cm/mile does not convert to on-screen real estate. The reason for this is that we all use different DPI settings, albeit 92 DPI seems to be one of the more common settings nowadays.

There are also varying DPI settings for printers...

To calculate the pixels from inches, you could try:

pixels = inches * someDpiSetting

but bear in mind this will not result in inches on every screen, every printout, etc.

EDIT: If you take a look at WPF you'll find that it has fantastic support for DPI, and will translate a form to the same (give or take) size regardless of DPI. Maybe that helps?


Bitmaps don't have a size in inches, their size is measured in pixels. That said most modern bitmat formats have a piece of metadata called DPI (dots per inch) that is used to translate a size in pixels to a size in inches via the simple formula:

inches = pixels / dpi

For the Image class you set metadata using the SetPropertyItem Method where the pieces of metadata we are interested in are:

  • PropertyTagResolutionUnit - set this to "2" for inches
  • PropertyTagXResolution - Essentially the X DPI as long as PropertyTagResolutionUnit is in inches.
  • PropertyTagYResolution - The Y DPI as long as PropertyTagResolutionUnit is in inches

See Property Item Descriptions for details.

(Actually, I realised half way through writing this that the setting of property metadata using SetPropertyItem looks really complicated - you might just be better off using Bitmat instead, which has resolution properties making the whole thing a lot easier)


As a contrast to those imperial measures and formula-only's:

    // 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

Like so:

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


If you are using a Bitmap then it has the method SetResolution (http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.setresolution.aspx) that allows you to set the x and y dpi which can be easily derived from your knowledge of the height and width of the image in pixels and inches that you already have.

I'm hoping here that using a Bitmap instead of an Image shouldn't be a problem. Its a subclass so I would imagine it is likely you can.


            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
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜