FM/Assets/Scripts/Base/Tool/ImageDpiProcessor.cs

132 lines
4.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

namespace Zenith
{
using System;
using System.IO;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Metadata;
using UnityEngine;
public static class ImageDpiProcessor
{
/// <summary>
/// 修改现有图片文件的DPI
/// </summary>
/// <param name="inputPath">原始图片路径</param>
/// <param name="outputPath">输出图片路径(可与输入路径相同,覆盖原文件)</param>
/// <param name="dpi">目标DPI值水平和垂直方向将使用相同值</param>
/// <returns>是否成功</returns>
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;
}
}
/// <summary>
/// 将Unity的Texture2D保存为指定DPI的图片
/// </summary>
/// <param name="texture">Unity纹理</param>
/// <param name="savePath">保存路径(需包含文件名和扩展名,如.png</param>
/// <param name="dpi">目标DPI值</param>
/// <returns>是否成功</returns>
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;
}
}
}
}