画像をJPEGに保存しようとしています。以下のコードは、画像の幅が4の倍数の場合は正常に機能しますが、それ以外の場合は画像が歪んでいます。それはパディングと関係があります。デバッグ中は、各行に0を埋め込むことで、画像をビットマップとして正しく保存できました。ただし、これはJPEGでは機能しませんでした。
覚えておくべき主なポイントは、私の画像がネイティブコールから受け取ったbgr(青緑赤各1バイト)バイト配列として表されていることです。
byte[] data = captureImage(OpenGLCanvas.getLastFocused().getViewId(), x, y);
if (data.length != 3*x*y)
{
// 3 bytes per pixel
return false;
}
// create buffered image from raw data
DataBufferByte buffer = new DataBufferByte(data, 3*x*y);
ComponentSampleModel csm = new ComponentSampleModel(DataBuffer.TYPE_BYTE, x, y, 3, 3*x, new int[]{0,1,2} );
WritableRaster raster = Raster.createWritableRaster(csm, buffer, new Point(0,0));
BufferedImage buff_image = new BufferedImage(x, y, BufferedImage.TYPE_INT_BGR); // because windows goes the wrong way...
buff_image.setData(raster);
//save the BufferedImage as a jpeg
try
{
File file = new File(file_name);
FileOutputStream out = new FileOutputStream(file);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(buff_image);
param.setQuality(1.0f, false);
encoder.setJPEGEncodeParam(param);
encoder.encode(buff_image);
out.close();
// or JDK 1.4
// ImageIO.write(image, "JPEG", out);
}
catch (Exception ex)
{
// Write permissions on "file_name"
return false;
}
また、C ++でJPEGを作成することも検討しましたが、その内容はさらに少なくなりましたが、それでもオプションです。
どんな助けでも大いに感謝します。レオン