namespace Zenith
{
using System;
using System.IO;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Metadata;
using UnityEngine;
public static class ImageDpiProcessor
{
///
/// 修改现有图片文件的DPI
///
/// 原始图片路径
/// 输出图片路径(可与输入路径相同,覆盖原文件)
/// 目标DPI值(水平和垂直方向将使用相同值)
/// 是否成功
public static bool ModifyImageDpi(string inputPath, string outputPath, int dpi)
{
try
{
// 验证输入文件
if (!File.Exists(inputPath))
{
Debug.LogError($"文件不存在: {inputPath}");
return false;
}
// 确保DPI值有效
if (dpi <= 0)
{
Debug.LogError("DPI值必须大于0");
return false;
}
// 加载图片并修改DPI
using (var image = Image.Load(inputPath))
{
// 设置分辨率单位为英寸(DPI的标准单位)
image.Metadata.ResolutionUnits = PixelResolutionUnit.PixelsPerInch;
// 设置水平和垂直DPI
image.Metadata.HorizontalResolution = dpi;
image.Metadata.VerticalResolution = dpi;
// 确保输出目录存在
string outputDirectory = Path.GetDirectoryName(outputPath);
if (!Directory.Exists(outputDirectory))
{
Directory.CreateDirectory(outputDirectory);
}
// 保存修改后的图片(自动保留原格式)
image.Save(outputPath);
}
Debug.Log($"成功将图片DPI修改为 {dpi}: {outputPath}");
return true;
}
catch (Exception ex)
{
Debug.LogError($"修改DPI失败: {ex.Message}");
return false;
}
}
///
/// 将Unity的Texture2D保存为指定DPI的图片
///
/// Unity纹理
/// 保存路径(需包含文件名和扩展名,如.png)
/// 目标DPI值
/// 是否成功
public static bool SaveTextureWithDpi(Texture2D texture, string savePath, int dpi)
{
try
{
if (texture == null)
{
Debug.LogError("Texture2D不能为空");
return false;
}
// 从Texture2D获取图片字节数据(根据保存格式选择编码方式)
byte[] imageData;
string extension = Path.GetExtension(savePath).ToLower();
if (extension == ".png")
{
imageData = texture.EncodeToPNG();
}
else if (extension == ".jpg" || extension == ".jpeg")
{
imageData = texture.EncodeToJPG(90); // 90%质量
}
else
{
Debug.LogError("不支持的图片格式,仅支持PNG和JPG");
return false;
}
// 使用内存流处理图片数据
using (var memoryStream = new MemoryStream(imageData))
using (var image = Image.Load(memoryStream))
{
// 设置DPI元数据
image.Metadata.ResolutionUnits = PixelResolutionUnit.PixelsPerInch;
image.Metadata.HorizontalResolution = dpi;
image.Metadata.VerticalResolution = dpi;
// 确保保存目录存在
string directory = Path.GetDirectoryName(savePath);
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
// 保存图片
image.Save(savePath);
}
Debug.Log($"Texture2D已保存为 {dpi} DPI: {savePath}");
return true;
}
catch (Exception ex)
{
Debug.LogError($"保存带DPI的图片失败: {ex.Message}");
return false;
}
}
}
}