我正在尝试从位图创建调整大小的图像,设置新的高度/宽度和新的分辨率并将其保存为 PNG。我可以直接从 A) Image.FromFile(filename)
中做到这一点或 B) New Bitmap(imageSource)
创建 一个 位图传递给 乙 .两者都可以正常工作,但是 一个 不允许我在创建时设置新的宽度/高度(但它允许我使用 useIcm=True
和 保留值)乙 不允许我保留值。
好的,现在开始一些代码和示例:
Dim sourceBitmap As New
Bitmap(imagePath & myImage1Name)
<-一点都不好(#1 过载)。不保存诸如
HorizontalResolution
或 PixelFormat
在 .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/