0

C++ を使用して画像をロードし、ByteBuffer を介してピクセルを JNI に供給しています。画像が正方形の場合、完全に正常にレンダリングされるため、ピクセルが正常に供給されていることはわかっています。長方形の場合、歪みます。また、画像をDLLに正常に保存しましたが、動作します。Java は残念ながら私をあきらめました (正方形のようなものでない限り)。理由がわかりません!私は何を間違っていますか?

package library;
import java.awt.image.BufferedImage;
import javax.swing.*;

public class Frame extends JFrame {

    public Frame(int Width, int Height, String FrameName, BufferedImage Buffer) {
        setName(FrameName);
        setSize(Width, Height);
        getContentPane().add(new JLabel(new ImageIcon(Buffer)));
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setVisible(true);
    }
}

すべての読み込み:

package library;

import java.awt.image.BufferedImage;
import java.awt.image.WritableRaster;
import java.io.IOException;
import java.nio.ByteBuffer;

class SharedLibrary {

    static{System.loadLibrary("TestDLL");} 
    private static native void GetGLBuffer(ByteBuffer Buffer);

    private ByteBuffer Buffer = null;    
    private int ByteSize = 0, Width = 0, Height = 0, BitsPerPixel = 32;

    public SharedLibrary(int ImageWidth, int ImageHeight) throws IOException {

        Width = ImageWidth;
        Height = ImageHeight;

        ByteSize = ((Width * BitsPerPixel + 31) / 32) * 4 * Height;     //Compute Image Size in Bytes.
    Buffer = ByteBuffer.allocateDirect(ByteSize);                   //Allocate Space for the image data.

        GetGLBuffer(Buffer);                                            //Fill the buffer with Image data from the DLL.

        byte[] Bytes = new byte[ByteSize];
        Buffer.get(Bytes);

        BufferedImage Image = new BufferedImage(Width, Height, BufferedImage.TYPE_3BYTE_BGR);
        WritableRaster raster = (WritableRaster) Image.getData();
        raster.setPixels(0, 0, Width, Height, ByteBufferToIntBuffer(Bytes));
        Image.setData(raster);

        Frame F = new Frame(Width, Height, "", Image);
    }

    private int[] ByteBufferToIntBuffer(byte[] Data) {
        int IntBuffer[] = new int[Data.length];
        for (int I = 0; I < Data.length; I++) {
            IntBuffer[I] = (int)Data[I] & 0xFF;
        }
        return IntBuffer;
    }
}

ここに画像の説明を入力 上の画像はほぼ正方形なので綺麗に描画されます。長方形にリサイズすると歪んでしまいます。例:

ここに画像の説明を入力

歪んで次のようになります。 ここに画像の説明を入力

4

0 に答える 0