以cm C#调整图像大小

Vic*_*eno 5 c# resize image pixels

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

Fre*_*örk 5

这实际上取决于用户打印图像的分辨率(以厘米为单位的尺寸除了打印时没有什么意义)。如果用户想要以 200 dpi 进行打印,则图像需要为 (10 / 2.54 * 200) x (6.88 / 2.54 * 200) 像素(需要除以 2.54 在厘米和英寸之间转换)。需要哪种分辨率很大程度上取决于它是什么类型的图像,以及用户的质量要求。

所以仅仅说“我想通过 Y 厘米将大小调整为 X”并没有什么意义。

有关如何在确定图像所需大小后进行实际调整大小的代码示例,此 SO 答案应满足您的需求。


Ste*_*ger 5

实际上,您必须区分屏幕上的图像尺寸和打印输出上的图像尺寸。

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

inches = pixels / dpi
Run Code Online (Sandbox Code Playgroud)

所以如下:

pixel = inches * dpi
Run Code Online (Sandbox Code Playgroud)

实际上,这是用于打印的。
对于显示器,将 dpi 替换为 ppi,就可以了。

对于那些不熟悉英寸的人(像我一样):

inches = pixels / dpi
pixel = inches * dpi
1 centimeter = 0.393700787 inch
pixel = cm * 0.393700787  * dpi
Run Code Online (Sandbox Code Playgroud)

该例程将计算像素大小,以使图像在监视器上显示 X 厘米。
但在打印机上,您就没有那么容易了,因为您无法像获得 PPI 一样轻松获得 DPI(bmp.Horizo​​ntalResolution 和 bmp.VerticalResolution)。

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
Run Code Online (Sandbox Code Playgroud)

用法如下:

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]
}
Run Code Online (Sandbox Code Playgroud)