Изменение размера изображения в см C # - PullRequest
5 голосов
/ 23 октября 2009

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

Ответы [ 5 ]

4 голосов
/ 22 мая 2014

На самом деле, вы должны различать размер изображения на экране и размер изображения на распечатке.

обычно вы найдете формулу:

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.Hor 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]
}
4 голосов
/ 23 октября 2009

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

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

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

2 голосов
/ 23 октября 2009

Форматы графических файлов, такие как 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 в пределах 10 см x 6,88 см.

0 голосов
/ 23 октября 2009

Это может быть так просто: большинство изображений хранят в них количество пикселей на дюйм. Подсчитайте количество пикселей в каждом измерении вашего изображения и разделите его на количество дюймов (в сантиметрах). Затем используйте оригинальные биты, просто измените поле для количества пикселей на дюйм (или, чаще, точек на дюйм).

Итак, ваша картинка должна быть 3,93 "х 2,71". Если ваше изображение 393px x 271px, вы должны установить dpi на 100x100. Если ваше изображение 39px x 27px, вы должны установить dpi на 10x10.

Хотя, вероятно, вам придется изменить размер, как объясняют другие ответы. :)

0 голосов
/ 23 октября 2009

Вид того, что говорит Фредрик: Я бы взял хороший DPI и потребовал бы, чтобы изображение имело это разрешение или больше (но с тем же соотношением сторон), а при экспорте / печати изображения измените размер изображения до DPI, используемого другой программой / принтером ...

...