2009-10-23 8 views
3

У меня есть требование, которое запрашивает изображение с размером 10 X 6,88 см. Я знаю, что я не могу просто преобразовать из cm в пиксели, так как размер одного пикселя зависит от разрешения экрана пользователя. Я хотел бы знать, есть ли способ изменить размер изображения, чтобы иметь этот размер в см. (Мне нужно также сохранить расширение изображения, например: не может преобразовать его в PDF или другое расширение)Изменение размера изображения в см C#

+0

вы можете просто пойти с разрешением изображения? –

+0

Чтобы уточнить размер, размер изображения зависит от разрешения IMAGE. Когда он отображается на экране, должно быть явное масштабирование разрешения устройства (но обычно этого не происходит). См. Здесь для получения дополнительной информации: http://www.atalasoft.com/cs/blogs/stevehawley/archive/2006/10/05/10954.aspx – plinth

ответ

4

Это действительно зависит от того, в каком разрешении пользователь напечатает изображение (размеры в см не имеют никакого смысла, кроме при печати). Если пользователь хочет сделать печать, скажем, 200 точек на дюйм, тогда изображение должно быть (10/2,54 * 200) на (6.88/2.54 * 200) пикселях (для преобразования между cm и дюймами требуется деление с 2.54). Какая требуемая резолюция в значительной степени зависит от того, какой образ она представляет, и требований к качеству пользователя.

Так что просто сказать «Я хочу изменить размер до X на Y см» на самом деле не имеет смысла.

Для примера кода, как сделать фактическое изменение размера после того, как вы выяснили необходимый размер изображения, this SO answer должен покрыть ваши потребности.

+0

Несогласие с «размерами в см не имеет смысла, кроме как при печати», размеры в cm имеют прекрасный смысл, когда вы должны просмотреть документ в том же размере, который будет напечатан (например, дизайнер WYSIWYG). В противном случае вы попадаете в классический WYSINWYG (что вы видите не то, что вы получаете), например, в Microsoft Report Designer (SSRS). –

0

Я бы взял хороший 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, что позволяет изображение размеры Ш х В приступе пределах 10 см х 6.88cm границ ,

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 так же просто, как PPI (bmp.HorizontalResolution & 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] 
} 
Смежные вопросы