最近在做一个项目,甲方要求自己可以更换LOGO图标,通过参考其他的博客弹出对话框(地址 https://blog.csdn.net/weixin_38472903/article/details/78204366 ),并通过自己的修改最终实现了此项功能。此方式是首先是获得一个图片的地址,然后通过此地址将图片显示在RawImage中。还有一个问题是关掉软件的再次打开图片就会丢失了,所以将图片的地址存储在数据库中,下一次打开是就可以显示上一次显示的图片了。实现此功能要两个脚本。
脚本:OpenFileName.cs
sing UnityEngine;
using System.Collections;
using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class OpenFileName
{
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;
}
public class WindowDll
{
[DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
public static extern bool GetOpenFileName([In, Out] OpenFileName ofn);
public static bool GetOpenFileName1([In, Out] OpenFileName ofn)
{
return GetOpenFileName(ofn);
}
}
脚本:Image_Logo
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using MySql.Data.MySqlClient;
using System;
using UnityEngine.UI;
using LitJson;
using System.IO;
using System.Runtime.InteropServices;
//using System.Windows.Forms;
public class Image_Logo : MonoBehaviour {
// Use this for initialization
void Start () {
}
//通过按钮打开对话框获取图片地址并存入数据库中
public void Image_Onclick(GameObject button)
{
if (button.name == "LOGO按钮")
{
string constr = "server=localhost;Database=crane_database;User Id=root;password=123456;charset=utf8";
MySqlConnection mycon = new MySqlConnection(constr); //建立连接
mycon.Open();
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = mycon;
OpenFileName ofn = new OpenFileName();
ofn.structSize = Marshal.SizeOf(ofn);
ofn.filter = "图片文件(*.jpg,*.png,*.bmp)\0*.jpg;*.png;*.bmp";//图片文件
ofn.file = new string(new char[256]);
ofn.maxFile = ofn.file.Length;
ofn.fileTitle = new string(new char[64]);
ofn.maxFileTitle = ofn.fileTitle.Length;
string path = Application.streamingAssetsPath;
path = path.Replace('/', '\\');
//默认路径
ofn.initialDir = path;
//ofn.initialDir = "D:\\MyProject\\UnityOpenCV\\Assets\\StreamingAssets";
ofn.title = "选择图片";
ofn.defExt = "JPG";//显示文件的类型
//注意 一下项目不一定要全选 但是0x00000008项不要缺少
ofn.flags = 0x00080000 | 0x00001000 | 0x00000800 | 0x00000200 | 0x00000008;//OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST| OFN_ALLOWMULTISELECT|OFN_NOCHANGEDIR
if (WindowDll.GetOpenFileName(ofn))
{
Debug.Log("Selected file with full path: {0}" + ofn.file);
}
if (ofn.file != "")//将图片的地址存入数据库中
{
//StartCoroutine(WaitLoad(path));
//Debug.Log("获得文件路径成功:" + ofn.file);
path = ofn.file;
cmd.CommandText = "update login_db set LOGO =@path where id=1";
MySqlParameter p = cmd.Parameters.Add("path", MySqlDbType.VarString);
p.Value = path;
cmd.ExecuteNonQuery();
}
}
}
//显示图片
void Update () {
string constr = "server=localhost;Database=crane_database;User Id=root;password=123456;charset=utf8";
MySqlConnection mycon = new MySqlConnection(constr); //建立数据库连接
mycon.Open();
RawImage rawimage = GameObject.Find("LOGO1").GetComponent<RawImage>();//获取unity中的RawImage
//在数据库中取出图片的地址
MySqlDataAdapter path = new MySqlDataAdapter("select LOGO from login_db where id = 1", mycon);
System.Data.DataSet path1 = new System.Data.DataSet();
path.Fill(path1);
string Path = Convert.ToString(path1.Tables[0].Rows[0][0]);
WWW www = new WWW("file:///" + Path);
Texture2D texture = www.texture;
//byte[] bytes = texture.EncodeToJPG();
//System.IO.File.WriteAllBytes(Path, bytes);
//Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f));
rawimage.texture = texture;//显示图片
}
}
效果: