在C#中调整图像尺寸(厘米单位)

6

我有一个需求,要求一张图片大小为10 X 6.88厘米。 我知道不能简单地将厘米转换为像素,因为一个像素的大小取决于用户显示器的分辨率。 我想知道是否有一种方法可以调整图片大小以达到厘米尺寸。(我还需要保留图像扩展名,例如:不能将其转换为pdf或其他扩展名)


你能只使用图像分辨率吗? - Rubens Farias
澄清一下,图像大小取决于图像分辨率。当它在屏幕上显示时,应该有一个明确的比例缩放到设备分辨率(但通常不会有)。请参阅此处以获取更多信息:http://www.atalasoft.com/cs/blogs/stevehawley/archive/2006/10/05/10954.aspx - plinth
5个回答

5

实际上,您需要区分屏幕上图像的尺寸和打印出来的图像的尺寸。

通常,您可以找到以下公式:

inches = pixels / dpi

所以可以推断:
pixel = inches * dpi

这段内容是关于打印的,实际上。对于显示器,将dpi替换为ppi即可。
对于那些(像我一样)不熟悉英寸的人:
inches = pixels / dpi
pixel = inches * dpi
1 centimeter = 0.393700787 inch
pixel = cm * 0.393700787  * dpi

这个程序将计算像素大小,使得图片在显示器上以X厘米的尺寸呈现。
但是在打印机上,情况并不那么简单,因为你不能像获取PPI(bmp.HorizontalResolution 和 bmp.VerticalResolution)那样轻松得到DPI。

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

使用方法如下:

public System.Drawing.Image Generate(string Text, int CodeSize)
        {
            int minSize = Cm2Pixel(2.5); // 100;
            if (CodeSize < minSize)
                CodeSize = minSize;

            if (string.IsNullOrEmpty(Text))
            {
                System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(CodeSize, CodeSize);

                using (System.Drawing.Graphics gfx = System.Drawing.Graphics.FromImage(bmp))
                {

                    gfx.Clear(System.Drawing.Color.Black);
                    using(System.Drawing.Font fnt = new System.Drawing.Font("Verdana", 12, System.Drawing.FontStyle.Bold))
                    {
                        double y = CodeSize / 2.0 - fnt.Size;
                        gfx.DrawString("No Data", fnt, System.Drawing.Brushes.White, 5, (int)y, System.Drawing.StringFormat.GenericTypographic);
                    } // End Using fnt

                } // End using gfx

                return bmp;
            } // End if (string.IsNullOrEmpty(Text))

...[Generate QR-Code]
return [Generated QR-Code]
}

5
这取决于用户打印图像时所使用的分辨率(以厘米为单位的尺寸仅在打印时才有意义)。如果用户想要以200 dpi的分辨率打印照片,则该照片需要有(10/2.54 * 200) x (6.88/2.54 * 200)个像素(除以2.54是为了在厘米和英寸之间进行转换)。需要的分辨率高度依赖于图像类型和用户的质量要求。
因此,只是简单地说“我想将大小调整为X乘Y厘米”并不是很合理。
如果你已经确定了图像所需的大小,那么关于如何实际调整图像大小的代码示例,可以在这篇SO答案中找到。

与“厘米尺寸仅在打印时有意义”不同的是,当您需要以与实际打印尺寸相同的尺寸查看文档(例如WYSIWYG设计师)时,厘米尺寸非常有意义。否则,您将会遇到经典的WYSINWYG(您看到的并不是您得到的),例如Microsoft Report Designer(SSRS)。 - Stefan Steiger

2
像JPG和TIFF这样的图像文件格式有一个EXIF头,其中包含水平和垂直DPI等信息。
因此,如果您获得了具有此元数据的图像,就可以验证可打印大小。
double DPC = Image_DPI * 0.393700787;

double widthInCm = Image_Width * DPC;
double heightInCm = Image_Height * DPC;

if (widthInCm <= 10 && heightInCm <= 6.88) // do stuff

如果您需要调整图像的大小,使其不超过可打印尺寸,则可以采用反向计算的方式,计算出一个DPI比例,以便使尺寸为W x H的图像适合于10cm x 6.88cm的范围内。

0

弗雷德里克所说的意思是: 我会选择一个适当的DPI,并要求图像具有该分辨率或更高(但具有相同的纵横比),在导出/打印图像时,将图像调整为其他程序/打印机使用的DPI...


0

这可能很简单:大多数图像都会在其中存储每英寸的像素数。找出图像每个维度中的像素数,然后将其除以英寸数(从厘米转换)。然后使用原始位,只需修改每英寸像素数(或更常见的是每英寸点数)的字段。

因此,您的图片需要为3.93" x 2.71"。如果您的图像为393px x 271px,则应将dpi设置为100x100。如果您的图像为39px x 27px,则应将dpi设置为10x10。

尽管可能需要进行一些调整大小,如其他答案所解释的那样。 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接