ARGB转6位Hex值:C#图片分割文件名优化技术求助
解决C#图片颜色分割后文件名保留6位RGB值的问题
你当前代码生成文件名时用了color.ToArgb().ToString("X6"),但ToArgb()返回的是包含Alpha通道的32位整数值(格式为0xAARRGGBB),直接用X6格式化存在截断风险,更可靠的方式是直接提取颜色的R、G、B分量,拼接成标准6位十六进制字符串。
核心修改点
替换原代码中保存文件的行:
// 原代码 bitmap2.Save(Path.Combine(Path.GetDirectoryName(fileName), $"{Path.GetFileNameWithoutExtension(fileName)}_{color.ToArgb().ToString("X6")}.png"), ImageFormat.Png); // 修改后代码 bitmap2.Save(Path.Combine(Path.GetDirectoryName(fileName), $"{Path.GetFileNameWithoutExtension(fileName)}_{color.R:X2}{color.G:X2}{color.B:X2}.png"), ImageFormat.Png);
完整优化后代码
public class PNG2PNGS { public static void Convert(string sourcePath) { foreach (var fileName in Directory.GetFiles(sourcePath, "*.png")) { // 使用using自动释放Bitmap资源,避免内存泄漏 using (Bitmap bitmap = new Bitmap(fileName)) { List<Color> colors = new List<Color>(); for (int i = 0; i < bitmap.Width; i++) { for (int j = 0; j < bitmap.Height; j++) { Color color = bitmap.GetPixel(i, j); if (!colors.Contains(color)) { colors.Add(color); } } } foreach (Color color in colors) { using (Bitmap bitmap2 = new Bitmap(bitmap.Width, bitmap.Height, bitmap.PixelFormat)) { for (int i = 0; i < bitmap.Width; i++) { for (int j = 0; j < bitmap.Height; j++) { if (bitmap.GetPixel(i, j) == color) { bitmap2.SetPixel(i, j, color); } else { bitmap2.SetPixel(i, j, Color.Transparent); } } } // 生成仅含RGB的6位十六进制文件名 bitmap2.Save(Path.Combine(Path.GetDirectoryName(fileName), $"{Path.GetFileNameWithoutExtension(fileName)}_{color.R:X2}{color.G:X2}{color.B:X2}.png"), ImageFormat.Png); } } } } } }
额外优化说明
- 给所有
Bitmap对象添加using语句,确保图像资源能及时释放,避免内存占用过高 - 移除了原代码末尾无意义的
bitmap.GetPixel(0,0);语句
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

