unity 通过按钮打开对话框选实现更换显示Rawimage中的图片

最近在做一个项目,甲方要求自己可以更换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;//显示图片
    }

}

效果:
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值