关于动态引用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;
}

539

被折叠的 条评论
为什么被折叠?



