Изменение размера изображения в сантиметрах C#

StackOverflow https://stackoverflow.com/questions/1613117

  •  06-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

Это действительно зависит от того, в каком разрешении пользователь будет печатать изображение (размеры в см не имеют большого смысла, кроме как при печати). Если пользователь хочет сделать отпечаток, скажем, 200 точек на дюйм, тогда изображение должно быть (10 / 2,54 * 200) на (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-см изображения.
Но на принтере это не так просто, так как вы не можете получить DPI так же просто, как PPI (bmp.HorizontResolution & amp; 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]
}

Форматы файлов изображений, такие как 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, который позволяет изображению размерами Ш x В умещаться в пределах 10 см x 6,88 см.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top