Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中将原始图像转换为jpg_Java_C#_.net_Image Processing_Bufferedimage - Fatal编程技术网

在java中将原始图像转换为jpg

在java中将原始图像转换为jpg,java,c#,.net,image-processing,bufferedimage,Java,C#,.net,Image Processing,Bufferedimage,我有一个正在返回原始640x480 BGR的捕获设备。支持它的文档只有.net/C代码示例 下面是他们在.net SDK中的示例代码 Bitmap bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb); BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, b

我有一个正在返回原始640x480 BGR的捕获设备。支持它的文档只有.net/C代码示例

下面是他们在.net SDK中的示例代码

Bitmap bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb);
BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0,
                                                            bmp.Width,
                                                            bmp.Height),
                                              ImageLockMode.WriteOnly,
                                              bmp.PixelFormat);

Marshal.Copy(faceImage, 0, bmpData.Scan0, faceImage.Length);
bmp.UnlockBits(bmpData);
这是我在Java中得到的最接近的颜色,但颜色仍然不合适

int nindex = 0;
int npad = (raw.length / nHeight) - nWidth * 3;

BufferedImage bufferedImage = new BufferedImage(nWidth, nHeight, BufferedImage.TYPE_4BYTE_ABGR);
DataBufferByte dataBufferByte = ((DataBufferByte) bufferedImage.getRaster().getDataBuffer());
byte[][] bankData = dataBufferByte.getBankData();
byte brgb[] = new byte[(nWidth + npad) * 3 * nHeight];

System.arraycopy(raw, 0, brgb, 0, raw.length);

for(int j = 0; j < nHeight - 1; j++)
{
    for(int i = 0; i < nWidth; i++)
    {
        int base = (j * nWidth + i) * 4;
        bankData[0][base] = (byte) 255;
        bankData[0][base + 1] = brgb[nindex + 1];
        bankData[0][base + 2] = brgb[nindex + 2];
        bankData[0][base + 3] = brgb[nindex];
        nindex += 3;
    }
    nindex += npad;
}

ImageIO.write(bufferedImage, "png", bs);
int-nindex=0;
int npad=(原始长度/nHeight)-nWidth*3;
BuffereImage BuffereImage=新的BuffereImage(nWidth,nHight,BuffereImage.TYPE_4BYTE_ABGR);
DataBufferByte DataBufferByte=((DataBufferByte)BuffereImage.getRaster().getDataBuffer());
字节[][]bankData=dataBufferByte.getBankData();
字节brgb[]=新字节[(nWidth+npad)*3*n右];
System.arraycopy(原始、0、brgb、0、原始、长度);
对于(int j=0;j

红色和绿色似乎是颠倒的。感谢您的反馈,以便修复此问题。谢谢大家!

我觉得您代码的以下部分不太正确

bankData[0][base] = (byte) 255;
bankData[0][base + 1] = brgb[nindex + 1];
bankData[0][base + 2] = brgb[nindex + 2];
bankData[0][base + 3] = brgb[nindex];
您正在使用
TYPE\u 4BYTE\u ABGR
定义缓冲映像。Java文档说

字节数据在单个字节数组中按顺序a、B、G、R从低字节地址到高字节地址在每个像素内交错

根据您的说法,原始图像的格式也应该是BGR,因此原始图像中的字节从最低字节到最高字节的顺序应该是B、G、R,对吗?据我所知,从您的代码片段中,您正在将红色通道值复制到绿色通道,将蓝色通道值复制到红色通道,将绿色通道值复制到蓝色通道。复制字节应该更容易

bankData[0][base] = (byte) 255;
bankData[0][base + 1] = brgb[nindex]; // B
bankData[0][base + 2] = brgb[nindex + 1]; // G
bankData[0][base + 3] = brgb[nindex + 2]; // R

欢迎来到堆栈溢出!看起来您可能需要学习使用调试器。请随便吃点。如果您事后仍有问题,请将您的问题更具体地说明您需要什么帮助。