c# - Measure width of numbers in Bitmaps -
i created texture (bitmap) used drawing arbitrary numbers
the texture contains text: 0123456789.-
now need coordinates of each character.
textrenderer.measuretext(c.tostring(), m_font, new size(1, 1), textformatflags.nopadding);
...returns 16x17
g.measurestring(c.tostring(), m_font);
...returns 11.9x17.7
the actual size 8x11
my workaround manual measurement of each character yields next table: coords.add('0', new rectanglef(1, 3, 8, 11)); coords.add('1', new rectanglef(9, 3, 7, 11)); coords.add('2', new rectanglef(15, 3, 8, 11)); coords.add('3', new rectanglef(22, 3, 8, 11)); coords.add('4', new rectanglef(29, 3, 8, 11)); coords.add('5', new rectanglef(36, 3, 8, 11)); coords.add('6', new rectanglef(43, 3, 8, 11)); coords.add('7', new rectanglef(50, 3, 8, 11)); coords.add('8', new rectanglef(57, 3, 8, 11)); coords.add('9', new rectanglef(64, 3, 8, 11)); coords.add('.', new rectanglef(72, 3, 3, 11)); coords.add('-', new rectanglef(75, 3, 6, 11));
i utilize dynamic font, programmatic way measure size required.
tell measurestring method work generic typographic stringformat.
static void main(string[] args) { var image = new bitmap(1000, 500); var g = graphics.fromimage(image); g.fillrectangle(system.drawing.brushes.white, 0, 0, 1000, 500); var stringformat = new stringformat(stringformat.generictypographic) { alignment = stringalignment.near, formatflags = system.drawing.stringformatflags.linelimit | system.drawing.stringformatflags.noclip | stringformatflags.directionrighttoleft }; var font = new font(new system.drawing.fontfamily("times new roman"), 72.0f,fontstyle.regular, graphicsunit.point); var point = new pointf { x = 10, y = 10 }; sizef[] outputs = new sizef[7]; sizef[] total = new sizef[7]; outputs[0] = g.measurestring("t", font, point, stringformat); outputs[1] = g.measurestring("e", font, point, stringformat); outputs[2] = g.measurestring("s", font, point, stringformat); outputs[3] = g.measurestring("t", font, point, stringformat); outputs[4] = g.measurestring("s", font, point, stringformat); outputs[5] = g.measurestring("t", font, point, stringformat); outputs[6] = g.measurestring("r", font, point, stringformat); total[0] = g.measurestring("t", font, point, stringformat); total[1] = g.measurestring("te", font, point, stringformat); total[2] = g.measurestring("tes", font, point, stringformat); total[3] = g.measurestring("test", font, point, stringformat); total[4] = g.measurestring("tests", font, point, stringformat); total[5] = g.measurestring("testst", font, point, stringformat); total[6] = g.measurestring("teststr", font, point, stringformat); stringformat.formatflags = system.drawing.stringformatflags.linelimit | system.drawing.stringformatflags.noclip; g.drawstring("teststr", font, system.drawing.brushes.red, new pointf { x = 10, y = 10 }, stringformat); g.drawrectangle(new system.drawing.pen(system.drawing.brushes.blue, 1.0f), getoutputpositionx(total,outputs, 0), 10.0f, outputs[0].width, outputs[0].height); g.drawrectangle(new system.drawing.pen(system.drawing.brushes.blue, 1.0f), getoutputpositionx(total,outputs, 1), 10.0f, outputs[1].width, outputs[1].height); g.drawrectangle(new system.drawing.pen(system.drawing.brushes.blue, 1.0f), getoutputpositionx(total,outputs, 2), 10.0f, outputs[2].width, outputs[2].height); g.drawrectangle(new system.drawing.pen(system.drawing.brushes.blue, 1.0f), getoutputpositionx(total,outputs, 3), 10.0f, outputs[3].width, outputs[3].height); g.drawrectangle(new system.drawing.pen(system.drawing.brushes.blue, 1.0f), getoutputpositionx(total,outputs, 4), 10.0f, outputs[4].width, outputs[4].height); g.drawrectangle(new system.drawing.pen(system.drawing.brushes.blue, 1.0f), getoutputpositionx(total,outputs, 5), 10.0f, outputs[5].width, outputs[5].height); g.drawrectangle(new system.drawing.pen(system.drawing.brushes.blue, 1.0f), getoutputpositionx(total,outputs, 6), 10.0f, outputs[6].width, outputs[6].height); image.save(@"c:\temp\bla.png"); } private static float getoutputpositionx(sizef[] total, sizef[] outputs, int p) { homecoming 10.0f + total[p].width - outputs[p].width; } to position exactly, because of these overlapping characters have calculate width of "e" , total width of "te".
plus there bug in measurestring function. if phone call measurestring without stringformatflags.directionrighttoleft overlap of characters "te" ignored.
c# .net bitmap character
No comments:
Post a Comment