从System.Drawing.Image创建新的位图时保留位图值

Tod*_*ain 8 .net gdi+ image

我正在尝试从位图创建一个调整大小的图像,设置一个新的高度/宽度和一个新的分辨率,并将其保存到PNG.我可以直接从A)Image.FromFile(filename)或B)New Bitmap(imageSource)创建要传递给BA位图.两个都工作好schmokay,但A不允许我在创建时设置新的宽度/高度(但它确实允许我保留值),B不允许我预先设置值.useIcm=True

好的,现在谈谈一些代码和示例:

  1. Dim sourceBitmap As New Bitmap(imagePath & myImage1Name) < - 一点都不好(#1超载).不保留喜欢HorizontalResolutionPixelFormat打开的东西.Save

  2. Dim sourceBitmap2 As Bitmap = Image.FromFile(imagePath & myImage1Name, True)< - 不好(#5超载).它 保存之类的东西 HorizontalResolutionPixelFormat.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.

peh*_*ada 3

执行类似以下代码的操作怎么样:您可以在 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
Run Code Online (Sandbox Code Playgroud)