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

使用Javonet从.NET System.DrawingImage获取Java对象中的图像对象,java,c#,.net,javonet,Java,C#,.net,Javonet,我有一个关于使用标枪的问题。在.NET代码中,我有一个返回 System.DrawingImage,我必须在代码的Java端获得它。所以 当我通过javonetapi发出属性的“get”时,它返回一个 没问题。以下是一个例子: .NET代码: Java代码 我必须将“res”转换为Image或ImageIcon或类似的内容 JAVA有什么建议吗?我必须把它作为字节数组或其他什么吗 或者Javonet上还有另一种机制?任何复杂对象(如类)都将始终以“NObject”的形式返回,因此实际上它

我有一个关于使用标枪的问题。在.NET代码中,我有一个返回 System.DrawingImage,我必须在代码的Java端获得它。所以 当我通过javonetapi发出属性的“get”时,它返回一个 没问题。以下是一个例子:


.NET代码:



Java代码


我必须将“res”转换为Image或ImageIcon或类似的内容 JAVA有什么建议吗?我必须把它作为字节数组或其他什么吗 或者Javonet上还有另一种机制?

任何复杂对象(如类)都将始终以“NObject”的形式返回,因此实际上它是.NET端该对象的句柄。如果要将具体映像从.NET移动到Java,需要使用byte[]或string 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();
NObject ms=Javonet.New(“MemoryStream”);
yourImageNoObject.Save(ms,Javonet.getType(“System.Drawing.Imaging.ImageFormat”).getRef(“Jpeg”);
Byte[]imageBytes=ms.invoke(“ToArray”);
//您还可以将字节取消装箱到常规字节[]
byte[]unbox=新字节[fileBytes.length];
对于(int i=0;i
...
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!
}
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();