错误CS0029无法将类型'System.Drawing.Image'隐式转换为'UnityEngine.Sprite'

时间:2019-01-31 16:53:17

标签: c# unity3d

我有一个Unity游戏,数据库中有一些图像,需要在其中添加一些材料。问题是当我将图像设置为item.icon时,它给了我这个错误

错误CS0029无法将类型'System.Drawing.Image'隐式转换为'UnityEngine.Sprite' 这是我获得图像字节并转换为图像的类项目和代码。

编辑1 在我获取图片的位置添加了sql。我想将图像添加到Item.icon。

public class Item
{
    public string itemName;
    public Sprite icon;
}

 public List<Image> string_to_image()
{
    connString = string.Format("Server={0};Port={1};User Id={2};Password={3};Database={4};",
                                             serverName, port, userName, password, databaseName);
    imagem = null;
    using (var conn = new NpgsqlConnection(connString))
    {
        string sQL = "SELECT imagem from salva_imagem";
        using (var command = new NpgsqlCommand(sQL, conn))
        {
            byte[] productImageByte = null;
            conn.Open();
            var rdr = command.ExecuteReader();
            while (rdr.Read())
            {
                productImageByte = (byte[])rdr["imagem"]; ;
                num_imagem++;

                if (productImageByte != null)
                {
                   ImageConverter imageConverter = new ImageConverter();
                    var pic =    imageConverter.ConvertFrom(productImageByte) as Image;
                }
            }
            rdr.Close();
        }
    }
    return imagem ?? null;
}

2 个答案:

答案 0 :(得分:0)

您不能使用ImageConverter将字节转换为Unity组件Image

很难看到代码的精妙之处,这很难说,但是我想您想做的是将图像从给定的路径或URL加载到sprite组件的Image中。 / p>

public void GetTexture(string url, Action<Texture> onSuccess)
{
    StartCoroutine (LoadTexture(url, onSuccess));
}

private IEnumerator LoadTexture(string url, Action<Texture> onSuccess)
{
    UnityWebRequest www = UnityWebRequestTexture.GetTexture(url);
    yield return www.SendWebRequest();

    if(www.isNetworkError || www.isHttpError)
    {
        Debug.Log(www.error);
    }
    else 
    {
        onSuccess?.Invoke(((DownloadHandlerTexture)www.downloadHandler).texture);
    }
}

请注意,url也可以是本地文件路径,或者您可以从数据库中获取图像。

比您可以使用创建一个Sprite

GetTexture(pathOrUrl, OnSuccess);

private void OnSuccess(Texture texture)
{
    var tex = (Texture2D) texture;
    var newSprite = Sprite.Create(new Rect(0.0f, 0.0f, tex.width, tex.height), new Vector2(0.5f, 0.5f), 100.0f);

    // Assign it to an Image component
    imageReference.sprite = newSprite;
}

或者跳过该步骤,改用RawImage组件。但是请注意,这会增加调用,应该避免。

private void OnSuccess (Texture texture)
{
    rawImageReference.texture = texture;
}

答案 1 :(得分:0)

尝试使用ImageConversion.LoadImage。例如:

var myTexture2D = new Texture2D(128, 128);
ImageConversion.LoadImage(myTexture2D , myByteArray);

在这里,您可以在上一步中使用Sprite factory methods之一从Texture2D创建一个精灵:

var sprite = Sprite.Create(myTexture2D, new Rect(0, 0, 128, 128), new Vector2(0.5f, 0.5f));

此代码将使用整个纹理创建一个sprite,并将枢轴点置于中心。

希望有帮助。