Добавление текста НИЖЕ растрового изображения в VB.NET - PullRequest
0 голосов
/ 29 марта 2011

Я пытаюсь изменить размер растрового изображения .NET без фактического масштабирования изображения.Идея здесь состоит в том, чтобы создать пространство над и под изображением, заполнить его черным прямоугольником и поместить туда некоторый текст (не закрывая и не разрушая какую-либо часть исходного изображения).

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

Вот что у меня есть:

Dim imageSize As System.Drawing.Size
Dim exifImage As Image

exifImage = System.Drawing.Image.FromFile(originalPath)

imageSize.Height = exifImage.Height
imageSize.Width = exifImage.Width
imageSize.Height += BLAH '' whatever I need to add to my height for the text
'' this doesn't work, because the image gets stretched instead of stuff getting added above and below

Dim exifOverlayImage As New System.Drawing.Bitmap(exifImage, imageSize)

Dim graphic As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(exifOverlayImage)
graphic.InterpolationMode = InterpolationMode.HighQualityBicubic
graphic.SmoothingMode = SmoothingMode.HighQuality
graphic.PixelOffsetMode = PixelOffsetMode.HighQuality
graphic.CompositingQuality = CompositingQuality.HighQuality

'' Draw Title at the Top
Dim upperBackgroundRectangle = New Rectangle(0, 0, imageSize.Width, pointFontSize * 2)
graphic.DrawRectangle(Pens.Black, upperBackgroundRectangle)
graphic.FillRectangle(Brushes.Black, upperBackgroundRectangle)
graphic.DrawString(upperTitleCommentString, watermarkFont, New SolidBrush(Color.White), New Point(0, 3))

'' ... and more stuff ...

Я подозреваю, что мне нужно изменить какой-то режим масштабированияИли, может быть, создать новый холст или нечто большее, чем мое оригинальное изображение?Мысли / советы будут с благодарностью.Спасибо.

Ответы [ 2 ]

1 голос
/ 29 марта 2011

Вы должны создать растровое изображение с учетом недавно добавленной ширины и высоты.Вот как я это сделал (это в C #, но вы можете использовать www.developerfusion.com / tools / convert / csharp-to-vb / для его преобразования): ( width + pixelPadding и ** height + bottomSize + pixelPadding ** - это место, где добавляются отступы.)

            using (
          var dst = new Bitmap(width + pixelPadding, height + bottomSize + pixelPadding, PixelFormat.Format24bppRgb))
        {
            var rSrcImg = new Rectangle(0,0, src.Width, src.Height);
            var rDstImg = new Rectangle(pixelPadding / 2, pixelPadding/2, dst.Width - pixelPadding, dst.Height - pixelPadding - bottomSize);
            using (Graphics g = Graphics.FromImage(dst))
            {
                g.Clear(Color.FromArgb(64, 64, 64));
                g.FillRectangle(Brushes.White, rDstImg);

                g.CompositingMode = CompositingMode.SourceOver;
                g.CompositingQuality = CompositingQuality.GammaCorrected;
                g.SmoothingMode = SmoothingMode.HighQuality;
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;

                g.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
                g.DrawImage(src, rDstImg, rSrcImg, GraphicsUnit.Pixel);
            }

            var ms = new MemoryStream();

            // save the bitmap to the stream...
            dst.Save(ms, ImageFormat.Png);
            ms.Position = 0;  

Я написал сообщение в блоге об этом на http://www.devzone.ir/post/1389/09/16/Dynamic-Thumbnails-in-ASP.aspx. Размеры и добавляет некоторый отступ к изображению.
По сути, вам нужно создать растровое изображение размера + отступы.Затем заполните прямоугольник своим изображением и нарисуйте строку в нужной области.Статья написана на персидском языке, но вы можете использовать Google Translate.Я предоставил исходный код там.

0 голосов
/ 30 марта 2011

Я решил это немного по-другому.Вот функция, которая выполняет эту работу:

'' new function which creates a new image which is taller by extraHeight, and pastes the source image into it at pasteHeight
Private Function addBufferToImage(ByVal source As Image, ByVal backgroundColor As Color, ByVal extraHeight As Integer, ByVal pasteHeight As Integer) As Image
    Dim newBitmap As New Bitmap(source.Width, source.Height + extraHeight)
    Dim graphic As Graphics = Graphics.FromImage(newBitmap)
    graphic.Clear(backgroundColor)
    graphic.DrawImage(source, 0, pasteHeight) ' draw the original at (0, pasteHeight) on the new image
    graphic.Dispose()
    Return newBitmap
End Function

И затем я вызываю функцию в своем коде:

'' create a new Bitmap Object
Dim exifOverlayImage As New System.Drawing.Bitmap(originalImage, originalImageSize)
exifOverlayImage = addBufferToImage(exifOverlayImage, Color.Black, extraHeight, pasteHeight)
'' now I can write text in the new blank areas of the image
...