简体   繁体   English

如何从Unity3D访问本机Java位图?

[英]How can I access a native Java bitmap from Unity3D?

I want to use a bitmap which is loaded in my native Java library in my Unity project. 我想使用在我的Unity项目中的本机Java库中加载的位图。

How can I pass a bitmap from Java to C#? 如何将位图从Java传递到C#?

Due to your not very specific Question I just assume you have your image loaded as a BufferedImage . 由于您的问题不是很具体,我只假设您已将图像加载为BufferedImage So here's a suggestion on how to do it: 因此,这里有个建议:

Use the JNA Library to gain a better access to the resources of c#. 使用JNA库可以更好地访问c#资源。

And then maybe do something similar to this: 然后也许要做类似的事情:

BufferedImage someImage;
long somePointer;

DataBuffer data = someImage.getData().getDataBuffer();
int[] bankOffsets = data.getOffsets();
long offset = 0;
com.sun.jna.Pointer ptr = new com.sun.jna.Pointer(somePointer);
switch(data.getDataType()) {
case DataBuffer.TYPE_BYTE: 
    byte[][] bbanks = ((DataBufferByte) data).getBankData();
    for (int i = 0; i < bbanks.length; i++, offset += bbanks[i].length - bankOffsets[i]) 
        ptr.write(offset, bbanks[i], bankOffsets[i], bbanks[i].length - bankOffsets[i]);
break;
case DataBuffer.TYPE_DOUBLE:
    double[][] dbanks = ((DataBufferDouble) data).getBankData();
    for (int i = 0; i < dbanks.length; i++, offset += (dbanks[i].length - bankOffsets[i])*8) 
        ptr.write(offset, dbanks[i], bankOffsets[i], dbanks[i].length - bankOffsets[i]);
break;
case DataBuffer.TYPE_FLOAT:
    float[][] fbanks = ((DataBufferFloat) data).getBankData();
    for (int i = 0; i < fbanks.length; i++, offset += (fbanks[i].length - bankOffsets[i])*4) 
        ptr.write(offset, fbanks[i], bankOffsets[i], fbanks[i].length - bankOffsets[i]);
break;
case DataBuffer.TYPE_INT:
    int[][] ibanks = ((DataBufferInt) data).getBankData();
    for (int i = 0; i < ibanks.length; i++, offset += (ibanks[i].length - bankOffsets[i])*4) 
        ptr.write(offset, ibanks[i], bankOffsets[i], ibanks[i].length - bankOffsets[i]);
break;
case DataBuffer.TYPE_SHORT:
    short[][] sbanks = ((DataBufferShort) data).getBankData();
    for (int i = 0; i < sbanks.length; i++, offset += (sbanks[i].length - bankOffsets[i])*2) 
        ptr.write(offset, sbanks[i], bankOffsets[i], sbanks[i].length - bankOffsets[i]);
break;
case DataBuffer.TYPE_USHORT:
    short[][] usbanks = ((DataBufferUShort) data).getBankData();
    for (int i = 0; i < usbanks.length; i++, offset += (usbanks[i].length - bankOffsets[i])*2) 
        ptr.write(offset, usbanks[i], bankOffsets[i], usbanks[i].length - bankOffsets[i]);
break;
case DataBuffer.TYPE_UNDEFINED:
    throw new IllegalArgumentException("Unsupported data type");
}

The data written should be all your pixel color values. 写入的数据应该是所有像素颜色值。 The format depends on the image type (can be obtained using the getType() method in the class BufferedImage . 格式取决于图像类型(可以使用BufferedImage类中的getType()方法获得getType()

Alternatively you could also use the Java Native Interface but I haven't looked into that. 另外,您也可以使用Java本机接口,但我没有对此进行研究。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM