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

标签 .net image gdi+

我正在尝试从位图创建调整大小的图像,设置新的高度/宽度和新的分辨率并将其保存为 PNG。我可以直接从 A) Image.FromFile(filename) 中做到这一点或 B) New Bitmap(imageSource)创建 一个 位图传递给 .两者都可以正常工作,但是 一个 不允许我在创建时设置新的宽度/高度(但它允许我使用 useIcm=True 保留值)乙 不允许我保留值。

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

  • Dim sourceBitmap As New Bitmap(imagePath & myImage1Name)<-一点都不好(#1 过载)。不保存
    诸如 HorizontalResolutionPixelFormat.Save
  • Dim sourceBitmap2 As Bitmap = Image.FromFile(imagePath & myImage1Name, True) <-不好(#5 过载)。它确实
    保留诸如HorizontalResolution或者PixelFormat.Save , 但它
    没有 允许我以新大小初始化图像。
  • 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。

    最佳答案

    执行以下代码怎么样:您可以在 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
    

    关于.net - 从 System.Drawing.Image 创建新位图时保留位图值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2839001/

    相关文章:

    c# - WPF 执行两个交替的 UI 任务

    c# - 在 System.Runtime.Caching 中存储通用集合 - List<T>

    c# - 管理 GUI 状态的最佳方法是什么(创建、编辑、读取模式...)

    c# - 为 byte[] 调用 Initialize() 的结果是什么?

    image - 在相机捕获图像 Android 上设置实时帧(错误)

    deployment - windows xp 是否包含 GdiPlus.dll?

    iphone - 如何将颜色 'white' 从 UIImage 更改为透明

    c++ - 优化图像缓冲区

    c++ - 如何在不保存文件的情况下制作打印屏幕并将其发送到 FTP 服务器?我的工作代码将文件保存到 HDD

    c# - 私有(private)字体和画笔是邪恶的吗?