如何用代码实现PNG转512x512、32位深度?(解决黑图问题)
解决PNG图片尺寸调整并转换为32位深度的问题
你的代码生成黑色图片的核心原因是:Create24bpp方法仅创建了一个空的Bitmap容器,没有把原图像的内容绘制到新Bitmap中。要实现和Paint一致的效果,需要完成原图像缩放绘制+32位深度保存两个关键步骤,以下是修正后的实现:
修正后的完整代码
核心缩放转换方法
public static Bitmap ResizeTo32bppArgb(Image originalImage, Size targetSize) { // 创建32位ARGB格式的目标Bitmap Bitmap targetBitmap = new Bitmap(targetSize.Width, targetSize.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); // 使用Graphics绘制原图像并缩放,匹配Paint的高质量缩放效果 using (Graphics g = Graphics.FromImage(targetBitmap)) { // 设置高质量缩放参数 g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality; // 将原图像绘制到目标Bitmap,自动缩放至目标尺寸 g.DrawImage(originalImage, new Rectangle(0, 0, targetSize.Width, targetSize.Height)); } return targetBitmap; }
批量处理示例代码
string imageFolder = @"d:\Downloaded Images\Radar\Tuesday 01.31.2023 at 04.42 AM"; List<string> imagePaths = Directory.GetFiles(imageFolder, "*.png", SearchOption.TopDirectoryOnly).ToList(); foreach (string path in imagePaths) { using (Bitmap originalBmp = new Bitmap(path)) { using (Bitmap resizedBmp = ResizeTo32bppArgb(originalBmp, new Size(512, 512))) { // 生成输出路径,示例为原文件名后加"_resized" string outputPath = Path.Combine(Path.GetDirectoryName(path), $"{Path.GetFileNameWithoutExtension(path)}_resized.png"); // 保存为PNG格式,确保32位深度保留 resizedBmp.Save(outputPath, System.Drawing.Imaging.ImageFormat.Png); } } }
关键说明
- 绘制逻辑:通过
Graphics.DrawImage方法将原图像缩放绘制到新的32位Bitmap上,设置的HighQualityBicubic插值模式和Paint默认缩放算法一致,能保证图像质量。 - 资源释放:使用
using语句自动释放Bitmap和Graphics资源,避免内存泄漏。 - 格式保证:保存时指定
ImageFormat.Png,结合目标Bitmap的Format32bppArgb格式,确保输出的是符合要求的32位深度PNG图片。
内容的提问来源于stack exchange,提问作者Daniel Lip
相关产品推荐
相关产品推荐

