2015-12-24 3 views
0

Мне нужно нарисовать прямоугольник, размер которого должен быть размером 2X2 дюймов при печати на бумаге.Рисование прямоугольника размера 2X2 Дюймы -Выход к преобразованию пикселей

Я знаю, что я могу нарисовать прямоугольник с помощью

g.DrawRectangle(pen, 100,100, 100, 200); 

Это приложение будет использоваться только в computers.How можно преобразовать дюймы в пиксели правильно, так что я могу получить желаемые размеры при печати.

+0

Все зависит от установки DPI (точек на дюйм) на вашем принтере. Когда вы отправляете документ для печати, вы должны указать DPI, который вы хотите, чтобы это стало проще. В принципе, если у вас есть принтер с разрешением 100 dpi, то вы хотите нарисовать прямоугольник 2000 x 2000 (20 x 100) ... конечно, вам понадобится бумага, достаточно большая для этого. Ваш стандартный A4 не подходит для него – musefan

+0

@musefan Извините, это было 2X2 дюйма. – techno

+0

ha, ну просто пересчитать тогда ... [Установка DPI] x [Длина в дюймах] = [Число пикселей] – musefan

ответ

1

Чтобы сделать снимок изображения в нужном размере по умолчанию, он должен иметь правильную комбинацию dpi и пикселей.

Давайте посмотрим на пример:

// aiming at 150dpi and 4x6 inches: 
float dpi = 150; 
float width = 4; 
float height = 6; 

using (Bitmap bmp = new Bitmap((int)(dpi * width), (int)(dpi * height))) 
{ 
    // first set the resolution 
    bmp.SetResolution(dpi, dpi); 
    // then create a suitable Graphics object: 
    using (Graphics G = Graphics.FromImage(bmp)) 
    using (Pen pen = new Pen(Color.Orange)) 
    { 
     pen.Alignment = System.Drawing.Drawing2D.PenAlignment.Center; 
     G.Clear(Color.FloralWhite); 
     // using pixels here: 

     Size sz = new System.Drawing.Size((int)dpi * 2 - 1, (int)dpi * 2 - 1); 
     G.DrawRectangle(pen, new Rectangle(new Point(0, 0), sz)); 
     G.DrawRectangle(pen, new Rectangle(new Point(0, 300), sz)); 
     G.DrawRectangle(pen, new Rectangle(new Point(0, 600), sz)); 
     G.DrawRectangle(pen, new Rectangle(new Point(300, 0), sz)); 
     G.DrawRectangle(pen, new Rectangle(new Point(300, 300), sz)); 
     G.DrawRectangle(pen, new Rectangle(new Point(300, 600), sz)); 

     // alternative code: 
     // we can also set the Graphics object to measure stuff in inches; 
     G.PageUnit = GraphicsUnit.Inch; 
     // or fractions of it, let's use 10th: 
     G.PageScale = 0.1f; 
     using (Pen pen2 = new Pen(Color.MediumPurple, 1f/dpi * G.PageScale)) 
     { 
      // draw one rectangle offset by an inch: 
      G.DrawRectangle(pen2, 10f, 10f, 20f, 20f); 
     } 

     bmp.Save(@"D:\xxx.jpg", ImageFormat.Jpeg); 
    } 
} 

Обратите внимание, что я должен был вычесть 1 пиксель из нарисованного размера, как DrawRectangleoverdraws на 1 пиксель!

enter image description here

Обратите внимание, что координаты рисую в зависимости от разрешения! Также обратите внимание, как формат jpeg создает много размазанных цветов. Png создает более четкие результаты, особенно после того, как вы печатаете текст.

Также обратите внимание, как мне пришлось уменьшать PenWidth в альтернативном коде!

+0

Большое спасибо. Так что для разных размеров бумаги я просто изменю ширину, высоту и продолжайте рисовать прямоугольники. – techno

+0

Да. То же самое касается печати с лучшим разрешением. Обратите внимание, что координата, которую я рисую, зависит от разрешения! Также обратите внимание, как формат jpeg создает смазанные цвета. – TaW

+0

Я хотел спросить об этом. Как вы получили значение 300? – techno