Создание автоматического размера изображения в C # - PullRequest
0 голосов
/ 19 января 2012

Я использую следующий код для создания изображения с автоматическим размером:

    String id="foo bar";
    Color BackColor = Color.White;
    String FontName = "Times New Roman";
    int FontSize = 25;
    int Height = 50;
    int Width = 200;

    Bitmap bitmap = new Bitmap(Width,Height);
    Graphics graphics = Graphics.FromImage(bitmap);
    Color color = Color.Gray; ;
    Font font = new Font(FontName, FontSize);

    SolidBrush BrushBackColor = new SolidBrush(BackColor);
    Pen BorderPen = new Pen(color);

    Rectangle displayRectangle = new Rectangle(new Point(0, 0), new Size());

    graphics.FillRectangle(BrushBackColor, displayRectangle);
    graphics.DrawRectangle(BorderPen, displayRectangle);

    graphics.DrawString(id, font, Brushes.Black, 0, 0);

    FileContentResult result;

    using (var memStream = new System.IO.MemoryStream())
    {

        bitmap.Save(memStream, System.Drawing.Imaging.ImageFormat.Jpeg);
        result = this.File(memStream.GetBuffer(), "image/jpeg");
    }

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

Есть ли возможность сделать его динамичным?

Ответы [ 4 ]

3 голосов
/ 19 января 2012

Вы должны использовать:

SizeF size = graphics.MeasureString(id, font);

Это даст вам точное значение идентификатора, используя выбранный шрифт.
См. MeasureString синтаксис.

Так что вы могли бы сделать

Bitmap bmp = new Bitmap(1, 1);
Graphics graphics = Graphics.FromImage(bmp);
Font font = new Font(FontName, FontSize);
SizeF size = graphics.MeasureString("", font);
int width=1 + (int)size.Width;
int height= 1 + (int)size.Height;
bmp = new Bitmap(width,height);
Rectangle displayRectangle = new Rectangle(0, 0, width, height);
// All your previous code here
1 голос
/ 19 января 2012

У меня есть небольшой метод, который, используя один шрифт, выполняет итерацию, уменьшая размер шрифта в 1 пункт, пока текст не уместится в заданную ширину.

Public Function GetBestFitFont(ByVal pText As String, ByVal pFontInitial As Font, ByVal pWidth As Integer, ByVal g As Graphics) As Font
        Dim mfont As Font = pFontInitial 
        Dim sizeW As Integer = g.MeasureString( pText, mfont ).Width
        Do While sizeW >= pWidth
            If (mfont.Size - 1) > 1 Then
                mfont = New Font(mfont.FontFamily, mfont.Size - 1, mfont.Style, mfont.Unit)
            Else
                Exit Do
            End If
            sizeW = g.MeasureString( pText, mfont ).Width
        Loop
        Return mfont
    End Function
0 голосов
/ 19 января 2012

Посмотрите методы GDI Measurestring и GetTextExtent, чтобы получить размер создаваемого текста, затем вы можете изменить размер растрового изображения.

0 голосов
/ 19 января 2012

Вы можете попробовать этот метод.Я рассчитал размер шрифта на основе ширины изображения и длины текста.

private void WriteWatermarkText(Image image)
        {
            string watermark = config.Watermark.Text;

            if (string.IsNullOrEmpty(watermark))
                return;

            // Pick an appropriate font size depending on image size
            int fontsize = (image.Width / watermark.Length);//get the font size with respect to length of the string;

            if (fontsize > 24)
                fontsize = 18;

            // Set up the font
            using (Graphics graphics = Graphics.FromImage(image))
            {
                graphics.TextRenderingHint = TextRenderingHint.AntiAlias;
                Font font = new Font("Arial Black", fontsize, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Pixel);

                // Determine size of watermark to write background
                SizeF watermarkSize = graphics.MeasureString(watermark, font);
                int xPosition = (image.Width / 2) - ((int)watermarkSize.Width / 2);
                int yPosition = (image.Height / 2) - ((int)watermarkSize.Height / 2);

                // Write watermark
                graphics.DrawString(
                watermark,
                font,
                new SolidBrush(Color.FromArgb(config.Watermark.Opacity, Color.WhiteSmoke)),
                xPosition,
                yPosition
                );
                graphics.Dispose();
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...