Сохранение значений растрового изображения при создании нового растрового изображения из System.Drawing.Image - PullRequest
8 голосов
/ 15 мая 2010

Я пытаюсь создать изображение с измененным размером из растрового изображения, установить новую высоту / ширину и новое разрешение и сохранить его в PNG. Я могу сделать это либо непосредственно из A) Image.FromFile(filename) или B) New Bitmap(imageSource), чтобы создать растровое изображение A для передачи в B . Оба работают хорошо, schmokay, но A не позволяет мне устанавливать новую ширину / высоту при создании (но это позволяет мне сохранять значения с useIcm=True) и B не позволяет мне сохранять значения.

Хорошо, теперь немного кода и примеров:

  1. Dim sourceBitmap As New Bitmap(imagePath & myImage1Name) <-не очень хорошо (перегрузка # 1). Не сохраняет такие вещи, как <code>HorizontalResolution или PixelFormat на .Save

  2. Dim sourceBitmap2 As Bitmap = Image.FromFile(imagePath & myImage1Name, True) <- плохо (перегрузка # 5). это <em>делает сохранить такие вещи, как HorizontalResolution или PixelFormat на .Save, но это не позволяет мне инициализировать изображение в новом размере.

  3. Dim targetBitmap As New Bitmap(sourceBitmap2, newWidth, newHeight) sourceBitmap2 (см. № 2 выше) было инициализируется с useIcm=True, это не важно, как только я прошел его в качестве источника в targetBitmap.

По сути, я ищу способ создания нового растрового изображения с помощью чего-то вроде useIcm=True и , устанавливающих ширину / высоту одновременно (Width / Height считываются только свойства после его создания).

Я также прошел по маршруту Graphics.DrawImage, и он такой же - Graphics.FromImage(sourceBitmap) не сохраняет значения.

Зачем мне нужно, чтобы эти значения были сохранены? Потому что мне нужно преобразовать эти изображения в PNG (для размера файла) с новым разрешением и сохранить те же физические размеры (ш / ч в дюймах) для печати. Я знаю новые ширину / высоту пикселя, необходимые на основе значений разрешения, которые я передам с .SetResolution(xDpi,yDpi), чтобы сохранить физические размеры, так что это не проблема. Проблема в том, что такие вещи, как PixelFormatSize, должны оставаться неизменными (да, я пробовал EncoderParameters - они не работают. Я могу дать вам кровавые подробности, если хотите, но на данный момент достаточно сказать, что они просто не работает).

Уфф, снял это с моей груди! Хорошо, кто-нибудь, кто действительно знает, как все это работает, может помочь?

РЕДАКТИРОВАТЬ : Типы файлов, необходимые для преобразования в PNG: BMP, TIF, GIF, WMF, EMF.

Ответы [ 2 ]

3 голосов
/ 05 июня 2010

Почему бы просто не сделать Dim targetBitmap As New Bitmap(Image.FromFile(imagePath & myImage1Name, True), newWidth, newHeight)?

3 голосов
/ 25 мая 2010

Как насчет того, чтобы сделать что-то вроде следующего кода: Вы можете рисовать растровое изображение на NEWGraphic. После перерисовки вы можете связываться с размером.

  Dim NewGraphic As Graphics = Nothing
        Dim OutBMP As Bitmap

        Using bmp As New Bitmap(3264, 4224)
            Try

                NewGraphic = Graphics.FromImage(bmp)
                NewGraphic.FillRectangle(New SolidBrush(Color.White), 0, 0, 3264, 4224)
                NewGraphic.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
                NewGraphic.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
                NewGraphic.PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality
                NewGraphic.CompositingQuality = Drawing2D.CompositingQuality.HighQuality
                NewGraphic.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAliasGridFit

                NewGraphic.DrawImage(MetaFileToConvert, 0, 0, 3264, 4224)

                OutBMP = CType(FFConvertToBitonal(CType(bmp, Bitmap)), Bitmap)
                OutBMP.SetResolution(385, 385)

                OutImage = DirectCast(OutBMP, Image)

            Catch ex As Exception
                Throw ex
            Finally
                NewGraphic.Dispose()

            End Try

        End Using
...