我有一个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;
}
答案 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,并将枢轴点置于中心。
希望有帮助。