使用 Javonet 从 .NET System.DrawingImage 获取 Java 对象中的图像对象

本文关键字:对象 Java 图像 获取 DrawingImage Javonet NET System 使用 | 更新日期: 2023-09-27 18:33:10

我有一个关于使用Javonet的问题。在 .NET 代码中,我有一个返回System.DrawingImage 和我必须在我的 Java 代码端获取它。所以当我通过 Javonet API 发出属性的"get"时,它会返回一个不,不。下面是示例:


.NET 代码:


...
namespace ImageTest
{
    public class FileReader
    {
        public byte[] GetByteArray(string filename)
        {
            return System.IO.File.ReadAllBytes(filename);
        }
        public System.Drawing.Image GetImage(string filename)
        {
            byte[] b = GetByteArray(filename);
            using (var ms = new System.IO.MemoryStream(b, false))
            {
                return Image.FromStream(ms);
            }
        }
    }
}

爪哇代码


...
public Image getImage(String fileName) {
    NObject res = null;
    try {
       res = item.get(propName); // Casting NObject to Image is not allowed!
    } catch (JavonetException jex) {
       jex.printStackTrace(); 
    }
    return res; // Wrong: an Image object must be returned!
}

我必须将"res"投射到图像或图像图标或类似的东西爪哇岛。有什么建议吗?我必须将其作为字节数组或其他东西获取还是Javonet上有另一种机制?

使用 Javonet 从 .NET System.DrawingImage 获取 Java 对象中的图像对象

任何复杂对象(如类)将始终以"NObject"的形式返回,因此实际上它是 .NET 端该对象的句柄。如果要将具体图像从.NET移动到Java,则需要使用值类型,因此以byte[]或字符串base64的形式进行,因为Java中没有"System.Drawing.Image"类的直接对应项。

因此,您只需要从System.Drawing.Image类中提取图像的值类型形式。

你可以这样做:

NObject ms = Javonet.New("MemoryStream");
yourImageNObject.Save(ms,Javonet.getType("System.Drawing.Imaging.ImageFormat").getRef("Jpeg"));
Byte[] imageBytes = ms.invoke("ToArray");
//you can also unbox the bytes to regular byte[]
byte[] unboxed = new byte[fileBytes.length];
for(int i=0; i<imageBytes.length;i++)
    unboxed[i]=imageBytes[i].byteValue();