Изменение размера изображения в СМ с#


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

5 3

5 ответов:

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

Поэтому просто говорю: "я хочу изменить размер на X по Y см " на самом деле не имеет смысла.

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

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

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

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-cm.
Но на самом деле ... принтер, это не так просто, так как вы не можете получить DPI так же легко, как PPI (bmp.HorizontalResolution и BMP.Вертикальное разрешение).

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

Форматы файлов изображений, такие как 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 см.

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

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

Таким образом, ваша фотография должна быть 3,93" x 2,71". Если ваше изображение 393px х 271px, вы должны установить разрешение 100х100. Если ваше изображение 39px x 27px, вы бы установить DPI до 10х10.

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