Unity exe包打开本地文件,保存图片

关于动态引用dll文件,需要把脚本文件放在Plugins文件夹下

一、打开本地文件夹  

        1、动态引用常用对话框动态库 comdlg32.dll 文件,添加一个和动态库文件一样的方法        

[DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
public static extern bool GetOpenFileName([In, Out] OpenFileDlg ofd);

        2、创建OpenFileDlg结构体

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class OpenFileDlg
{
    public int structSize = 0;
    public IntPtr dlgOwner = IntPtr.Zero;
    public IntPtr instance = IntPtr.Zero;
    public String filter = null;
    public String customFilter = null;
    public int maxCustFilter = 0;
    public int filterIndex = 0;
    public String file = null;
    public int maxFile = 0;
    public String fileTitle = null;
    public int maxFileTitle = 0;
    public String initialDir = null;
    public String title = null;
    public int flags = 0;
    public short fileOffset = 0;
    public short fileExtension = 0;
    public String defExt = null;
    public IntPtr custData = IntPtr.Zero;
    public IntPtr hook = IntPtr.Zero;
    public String templateName = null;
    public IntPtr reservedPtr = IntPtr.Zero;
    public int reservedInt = 0;
    public int flagsEx = 0;
}

3、打开方法

public static void OpenProject(Action<string, string> action , string filter = "图片文件(*.jpg*.png)\0*.jpg;*.png")
{
    Action<Action<string, string>, string> _OpenProject = OpenOpenFileDlg;
    _OpenProject.BeginInvoke(action, filter, null, null);
}

private static void OpenOpenFileDlg(Action<string, string> action, string filter)
{
    OpenFileDlg pth = new OpenFileDlg();
    pth.structSize = Marshal.SizeOf(pth);
    pth.filter = filter;//"图片文件(*.jpg*.png)\0*.jpg;*.png";
    pth.file = new string(new char[256]);
    pth.maxFile = pth.file.Length;
    pth.fileTitle = new string(new char[64]);
    pth.maxFileTitle = pth.fileTitle.Length;
    pth.initialDir = Application.dataPath.Replace('/', '\\');
    pth.title = "选择图片";
    pth.defExt = ".jpg��.png";
    pth.flags = 0x00080000 | 0x00001000 | 0x00000800 | 0x00000200 | 0x00000008;
    pth.dlgOwner = OpenFileDialog.GetForegroundWindow();
    if (OpenFileDialog.GetOpenFileName(pth))
    {
        string filepath = pth

二、保存到电脑文件夹

1、创建OPENFILENAME结构体

 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
 public struct OPENFILENAME
 {
     public int lStructSize;
     public IntPtr hwndOwner;
     public IntPtr hInstance;
     public string lpstrFilter;
     public string lpstrCustomFilter;
     public int nMaxCustFilter;
     public int nFilterIndex;
     public string lpstrFile;
     public int nMaxFile;
     public string lpstrFileTitle;
     public int nMaxFileTitle;
     public string lpstrInitialDir;
     public string lpstrTitle;
     public int Flags;
     public short nFileOffset;
     public short nFileExtension;
     public string lpstrDefExt;
     public IntPtr lCustData;
     public IntPtr lpfnHook;
     public string lpTemplateName;
     public IntPtr pvReserved;
     public int dwReserved;
     public int flagsEx;
 }

2、保存

public enum ImageFormat
{
    PNG,
    JPG,
    BMP,
    TGA
}
 private static ImageFormat GetFormatFromExtension(string filePath)
 {
     string extension = Path.GetExtension(filePath).ToLower();
     switch (extension)
     {
         case ".jpg": case ".jpeg": return ImageFormat.JPG;
         case ".bmp": return ImageFormat.BMP;
         case ".tga": return ImageFormat.TGA;
         default: return ImageFormat.PNG;
     }
 }
 // 保存Texture2D到文件
 public static bool SaveTextureWithDialog(Texture2D texture, string defaultName = "image")
 {
     if (texture == null)
     {
         Debug.LogError("纹理为空,无法保存");
         return false;
     }

     // 显示保存对话框
     string filePath = ShowSaveDialog(
         $"{defaultName}_{DateTime.Now:yyyyMMdd_HHmmss}.png",
         "PNG图片|*.png|JPG图片|*.jpg|BMP图片|*.bmp|TGA图片|*.tga|所有文件|*.*"
     );

     if (string.IsNullOrEmpty(filePath))
     {
         Debug.Log("保存已取消");
         return false;
     }

     // 根据文件扩展名确定格式
     ImageFormat format = GetFormatFromExtension(filePath);

     // 保存图片
     return SaveTextureToFile(texture, filePath, format);
 }
 private static bool SaveTextureToFile(Texture2D texture, string filePath, ImageFormat format)
{
    try
    {
        string directory = Path.GetDirectoryName(filePath);
        if (!Directory.Exists(directory))
        {
            Directory.CreateDirectory(directory);
        }
        byte[] imageData = null;
        switch (format)
        {
            case ImageFormat.PNG:
                imageData = texture.EncodeToPNG();
                break;
            case ImageFormat.JPG:
                imageData = texture.EncodeToJPG(85);
                break;
            case ImageFormat.BMP:
                imageData = texture.EncodeToPNG(); // Unity不支持BMP编码,使用PNG代替
                break;
            case ImageFormat.TGA:
                imageData = texture.EncodeToTGA();
                break;
            default:
                imageData = texture.EncodeToPNG();
                break;
        }
        if (imageData != null && imageData.Length > 0)
        {
            File.WriteAllBytes(filePath, imageData);
            return true;
        }
    }
    catch (Exception e)
    {
        Debug.LogError($"保存图片失败: {e.Message}");
    }
    return false;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝天与Lrong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值