2009-10-23 71 views
3

我有一个要求,要求与10×6,88厘米的图像。 我知道我不能简单地从cm转换为像素,导致一个像素大小取决于用户的显示分辨率。 我想知道是否有一种方法来调整图像的大小以厘米为单位。 (我需要保持图像扩展还如:不能将其转换为PDF或其它扩展名)以厘米C调整图像大小#

+0

可你只是图像分辨率去? – 2009-10-23 12:35:43

+0

要澄清,图像大小取决于图像分辨率。当它显示在屏幕上时,应该明确缩放到设备分辨率(但通常没有)。有关详细信息,请参阅此处:http://www.atalasoft.com/cs/blogs/stevehawley/archive/2006/10/05/10954.aspx – plinth 2009-10-23 12:41:20

回答

4

这真的取决于其分辨率,用户将打印图像(以厘米大小几乎没有什么意义比其他当打印时)。如果用户想要打印,例如200 dpi,那么图像需要(10/2.54 * 200)(6.88/2.54 * 200)像素(需要2.54的分区才能在厘米和英寸之间转换)。所需的分辨率高度依赖于它是什么样的图像以及用户的质量要求。

所以只是说:“我想用Y厘米调整为X”并没有真正意义。

关于如何使实际调整大小,一旦你已经想通了图像的大小需要,this SO answer应包括您需要的代码示例。

+0

不同意“以厘米为单位的尺寸除了打印时没什么意义”,尺寸以厘米为单位时,如果您必须查看与将要打印的尺寸相同的文档(例如,所见即所得设计器),则完美无缺。否则,最终会出现经典的WYSINWYG(你看到的并不是你所得到的),就像在微软报表设计器(SSRS)中一样。 – 2016-05-13 09:19:53

0

Fredrik在说什么: 我会拍摄一个漂亮的DPI,并要求图像的分辨率或更大(但宽高比相同),并且在导出/打印图像时,将图像调整为DPI使用其他程序/打印机...

0

这可能是如此简单:大多数图像存储在他们每英寸的像素数。找出图像每个维度的像素数量,并将其除以英寸数(从cm转换而来)。然后使用原始位,只需修改每英寸像素数的字段(或者更常见的是每英寸点数)。

所以你的图片需要是3.93“x 2.71”。如果您的图像是393px x 271px,则可以将dpi设置为100x100。如果您的图像是39px x 27px,则可以将dpi设置为10x10。

虽然可能你必须做一些调整大小,正如其他答案所解释的那样。 :)

2

图像文件格式,如JPG和TIFF具有EXIF header具有像的水平和垂直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比例,让10cm以内X6.88厘米界尺寸W x H契合的图像。

2

其实,你在屏幕上图像的大小来区分,并且图像尺寸打印输出。

通常情况下,你会发现公式:

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厘米。
但是在打印机上,您并不那么容易,因为您无法像DPI那样容易地获得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 

使用率会是这样的:

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] 
}