【问题标题】:How can I access a native Java bitmap from Unity3D?如何从 Unity3D 访问本机 Java 位图?
【发布时间】:2017-01-11 16:12:42
【问题描述】:

我想在我的 Unity 项目中使用我的原生 Java 库中加载的位图。

如何将位图从 Java 传递到 C#?

【问题讨论】:

    标签: unity3d bitmap native native-code


    【解决方案1】:

    由于您的问题不是很具体,我假设您将图像加载为BufferedImage。所以这里有一个关于如何做的建议:

    使用JNA Library 可以更好地访问c# 的资源。

    然后也许做一些类似的事情:

    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");
    }
    

    写入的数据应该是所有像素颜色值。格式取决于图片类型(可以使用BufferedImage类中的getType()方法获取。

    或者,您也可以使用 Java 原生接口,但我没有研究过。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-29
      • 2013-07-13
      • 1970-01-01
      • 2011-03-22
      • 1970-01-01
      • 2018-08-08
      • 2012-10-22
      • 1970-01-01
      相关资源
      最近更新 更多