更宽/更高的图像会失真 < >我使用C++加载图像,并通过字节缓冲将像素馈送到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); } }

更宽/更高的图像会失真 < >我使用C++加载图像,并通过字节缓冲将像素馈送到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); } },java,Java,所有装载: 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 v

所有装载:

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;
    }
}
包库;
导入java.awt.image.buffereImage;
导入java.awt.image.WritableRaster;
导入java.io.IOException;
导入java.nio.ByteBuffer;
类共享库{
静态{System.loadLibrary(“TestDLL”);}
私有静态本机void GetGLBuffer(ByteBuffer Buffer);
private ByteBuffer Buffer=null;
private int ByteSize=0,Width=0,Height=0,BitsPerPixel=32;
公共共享库(int-ImageWidth、int-ImageHeight)引发IOException{
宽度=图像宽度;
高度=图像高度;
字节大小=((宽度*比特像素+31)/32)*4*高度;//计算图像大小(字节)。
Buffer=ByteBuffer.allocateDirect(ByteSize);//为图像数据分配空间。
GetGLBuffer(Buffer);//用DLL中的图像数据填充缓冲区。
字节[]字节=新字节[ByteSize];
Buffer.get(字节);
BuffereImage=新的BuffereImage(宽度、高度、BuffereImage.TYPE_3BYTE_BGR);
WritableRaster raster=(WritableRaster)Image.getData();
设置像素(0,0,宽度,高度,字节缓冲区(字节));
Image.setData(光栅);
帧F=新帧(宽度、高度,“”,图像);
}
私有int[]ByteBufferToIntBuffer(字节[]数据){
int IntBuffer[]=新的int[Data.length];
对于(int I=0;I
上面的图像绘制得非常完美,因为它几乎是正方形。如果我将其调整为矩形,它会变形。例如:

失真,看起来像:

您确定这与图像是正方形有关,而与尺寸的其他方面无关吗?例如,我注意到你的“几乎是正方形”的图像也有可以被8整除的尺寸(一个甚至可以被16整除),但不工作的图像有奇数的尺寸(即:不能被2整除)。我在MS Paint中制作了图像:编辑:你是对的!当它是可分割的时,它就工作了:O是否有我可以用Java填充它的地方?它在C++端工作。或者,我应该在它发送到Java之前把它放在C++端吗?它也被翻转为底部,对应java。是的,你可以添加填充…您只需要分配一个已填充了正确数量的缓冲区,然后在读取扫描行末尾时向前跳过正确数量的字节。您确定问题在于Java需要填充,而不是您的数据包含意外的填充吗?倾斜的方向对我来说是后者,但可能我也被垂直翻转弄糊涂了(正如@trashgood指出的)。不管是哪种方式,只要你弄清楚到底发生了什么,你就可以在Java端纠正这个问题。@LaurenceGonsalves:我看到C编译器的填充不同;这可能适用于垂直翻转。