English 中文(简体)
OpenExr, Swig 和 Java 开放Exr, Swig 和 Java
原标题:OpenExr, Swig and Java

我试图创建一个解决方案, 允许我读取 Java 中的 OpenExr 图像, 并将像素数据用于 JOGL 的纹理 。 因为 JOGL 没有免费 OpenExr 库( 找不到任何有效文件), 我的理念是使用 ILM OpenExr 库写入一个小 c++ 程序, 并用 Swig 包住它, 这样我就可以使用 JNI 在 Java 中装入和使用 dll 。

我建了OpenExr图书馆,并在2005年视觉工作室设置了Swig。它已经创造了一个图纸,让我可以获取图像的维度,因此我猜工具链运行正常。

h 文件 :

#include <ImfRgbaFile.h>
#include <ImathBox.h>
#include <ImathVec.h>
#include <ImfRgba.h>
#include <ImfArray.h>
#include <iostream>
#include "String.h"
#include "RgbaStruct.h"

using namespace std;

class OpenExrReader {

    private:
        int width;
        int height;
        Imf::Array2D<Imf::Rgba> newPixels;
        Rgba rgba;

    public:

        //constructor
        OpenExrReader::OpenExrReader();
        //destructor
        OpenExrReader::~OpenExrReader();
        //methods
        int OpenExrReader::readExrFile(const char *filePath);
        int OpenExrReader::getHeight();
        int OpenExrReader::getWidth();
        Rgba OpenExrReader::getScruct(int i, int j);
};

cpp 文件 :

#include "OpenExrReader.h"

OpenExrReader::OpenExrReader() {

    width = 0;
    height = 0;
}

OpenExrReader::~OpenExrReader() {

}

int OpenExrReader::readExrFile(const char *filePath) {

    const char* fileName = filePath;

    try {

        Imf::RgbaInputFile file(fileName);
        Imath::Box2i dw = file.dataWindow();
        Imath::V2i dim(dw.max.x - dw.min.x + 1, dw.max.y - dw.min.y + 1);

        width = dw.max.x - dw.min.x + 1;
        height = dw.max.y - dw.min.y + 1;

        newPixels.resizeErase(height, width);

        int dx = dw.min.x;
        int dy = dw.min.y;

        file.setFrameBuffer(&newPixels[0][0] - dw.min.x - dw.min.y * width, 1, width);
        file.readPixels(dw.min.y, dw.max.y);
    }
    catch (Iex::BaseExc &e) {

        std::cerr << e.what() << std::endl;
    }

    return 0;
}

int OpenExrReader::getHeight() {

    return height;
}

int OpenExrReader::getWidth() {

    return width;
}

Rgba OpenExrReader::getScruct(int i, int j) {

    struct Rgba rgba = {newPixels[i][j].r,
                        newPixels[i][j].g,
                        newPixels[i][j].b,
                        newPixels[i][j].a};

    return rgba;
}

Rgba sturct :

#include <half.h>

#ifndef RGBASTRUCT_H
#define RGBASTRUCT_H

struct Rgba{

    half r;
    half g;
    half b;
    half a;
};

#endif

Swig 界面文件 :

/* File : OpenExrReader.i */
%module OpenExrReaderDll

%{
/* Put header files here or function declarations like below */
#include "OpenExrReader.h"
#include "RgbaStruct.h"
%}
%include "OpenExrReader.h"
%include "RgbaStruct.h"

Java测试程序:

public class OpenExrReaderMain {

static {

    System.loadLibrary("OpenExrReader");
}

/**
 * @param args
 */
public static void main(String[] args) {

    OpenExrReader reader = new OpenExrReader();
    reader.readExrFile("C:\path\someExrFile.exr");

    int height  = reader.getHeight();
    int width = reader.getWidth();

    for(int i = 0; i < height; i++) {

        for(int j = 0; j < width; j++) {

            Rgba rgba = reader.getScruct(i, j);

            SWIGTYPE_p_half r = rgba.getR();
            SWIGTYPE_p_half g = rgba.getG();
            SWIGTYPE_p_half b = rgba.getB();
            SWIGTYPE_p_half a = rgba.getA();

            System.out.print("r: " + r + " || ");
            System.out.print("g: " + g + " || ");
            System.out.print("b: " + b + " || ");
            System.out.print("a: " + a);
            System.out.println();
        }
    }
  }
}

就像我说过的,这有用......但是......而不是像素数据......我得到的每一个像素:

r: SWIGTYPE_p_half@6b8741 || g: SWIGTYPE_p_half@17cfa2a || b: SWIGTYPE_p_half@c0a52 || a: SWIGTYPE_p_half@79c3e2

最初的想法是,我必须在某个时候将像素数据复制到 Java 缓冲中, 以便将其用于 JOGL 。 因此我写了“ 获取Scruct( int i, int j) ” 方法, 以获得一个像素的 rba 数据, 并尽可能简化 JNI 界面 。

问题在于现在Swig不知道如何将 ILM 半数据类型转换成 Java 数据类型。 起初我试图在 Rgba- struct 中存储浮点值, 因为 Swig 知道如何转换这些值。 因此, 将半个转换成浮点数的 OpenExr doc 应该是没问题的, 但每次我尝试这样的东西时:

half a = newPixels[i][j].r;
float b = a;

我从VS收到一个错误信息 上面写着:

OpenExrReader.obj : error LNK2001: unresolved external symbol "private: static union half::uif const * const half::_toFloat" (?_toFloat@half@@0QBTuif@1@B)

我想到的另一个索尔图顿是使用 Swig 排版图, 并告诉包装纸将 ILM 半个转换成 Java 浮点, 但我不确定这是否可行 。

因为我对C++和VS知之甚少 这也是我第一次和Swig和JNI合作 我完全不知道如何解决这个问题

所以,有人知道如何解决这个问题 这样我就能把像素数据 变成一种java数据类型吗?

最佳回答

我找到了一个适合我的解决方案。在我添加了预处理器宏之后:

OPENEXR_DLL and PLATFORM_WINDOWS

在视觉演播室,我把一半的值投进浮体,Swig将其转换成正确的 Java 数据类型。

问题回答

这是因为没有为 SWIG 定义 < code> 半 结构。 尝试将页眉文件包含

%include "half.h"

并且您应该能够进入类型 一半





相关问题
Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Logging a global ID in multiple components

I have a system which contains multiple applications connected together using JMS and Spring Integration. Messages get sent along a chain of applications. [App A] -> [App B] -> [App C] We set a ...

Java Library Size

If I m given two Java Libraries in Jar format, 1 having no bells and whistles, and the other having lots of them that will mostly go unused.... my question is: How will the larger, mostly unused ...

How to get the Array Class for a given Class in Java?

I have a Class variable that holds a certain type and I need to get a variable that holds the corresponding array class. The best I could come up with is this: Class arrayOfFooClass = java.lang....

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...

热门标签