Android 如何将YUV映像的一部分发送到服务器?

Android 如何将YUV映像的一部分发送到服务器?,android,Android,我的应用程序从YUV中的摄像头获取预览帧并将其发送到服务器。我正在尝试更改它,以便它只将部分图像(裁剪)发送到服务器。但是,我希望循环遍历字节数组并直接将裁剪后的图像发送到服务器,而不是创建位图类并以这种方式进行裁剪 我的目标是尽可能提高效率 有没有人有一些用于裁剪YUV图像的伪代码(甚至更好的实际代码) 我希望代码能像这样工作: OutputStream out = clientSocket.getOutputStream(); byte[] preview = getCameraPrevie

我的应用程序从YUV中的摄像头获取预览帧并将其发送到服务器。我正在尝试更改它,以便它只将部分图像(裁剪)发送到服务器。但是,我希望循环遍历字节数组并直接将裁剪后的图像发送到服务器,而不是创建位图类并以这种方式进行裁剪

我的目标是尽可能提高效率

有没有人有一些用于裁剪YUV图像的伪代码(甚至更好的实际代码)

我希望代码能像这样工作:

OutputStream out = clientSocket.getOutputStream();
byte[] preview = getCameraPreview();
//Crop half of the image
int x = (int)(getX()/2);
int y = (int)(getY()/2);
//Send the width, height, and image size to the server
out.write(intToByteArray(x));
out.write(intToByteArray(y));
out.write(intToByteArray((int)(x*y)));
//Start sending the picture to the server
for(int i = 0; i < y; i++)
    for(int j = 0; j < x; j++)
        out.write(preview[i+j]);
OutputStream out=clientSocket.getOutputStream();
字节[]预览=getCameraPreview();
//裁剪图像的一半
intx=(int)(getX()/2);
int y=(int)(getY()/2);
//将宽度、高度和图像大小发送到服务器
out.write(intToByteArray(x));
out.write(intToByteArray(y));
out.write(intToByteArray((int)(x*y));
//开始将图片发送到服务器
for(int i=0;i
我知道代码根本不起作用,但希望你明白我在做什么

任何帮助都将不胜感激。

请查看android。这提供了一个YUV图像裁剪的简单实现,但它以jpeg格式生成输出


希望这有帮助。

这是一个C代码片段,用于在YUV420框架上进行就地裁剪 请注意,裁剪矩形的宽度和高度以及左侧和顶部应均匀

    // original frame
unsigned char mYUVFrame[frameSize];

    // crop position
int lo_x, lo_y, hi_x, hi_y;

    // original size of frame
int width, height;
int new_width = (hi_x-lo_x)+1;
int new_height = (hi_y-lo_y)+1;

unsigned char *orig_pos, *new_pos;
// Y
orig_pos = mYUVFrame + lo_y*width + lo_x;
new_pos = mYUVFrame;
for (int i=0; i<new_height; i++)
{
    memmove(new_pos, orig_pos, new_width);
    orig_pos += width;
    new_pos += new_width;
}
// Cb
orig_pos = mYUVFrame + width*height + lo_x/2 + lo_y*width/4;
new_pos = mYUVFrame+new_width*new_height;
for (int i=0; i<new_height/2; i++)
{
    memmove(new_pos, orig_pos, new_width/2);
    orig_pos += width/2;
    new_pos += new_width/2;
}
// Cr
orig_pos = mYUVFrame + (width*height*5)/4 + lo_x/2 + lo_y*width/4;
new_pos = mYUVFrame + (new_width*new_height*5)/4;
for (int i=0; i<new_height/2; i++)
{
    memmove(new_pos, orig_pos, new_width/2);
    orig_pos += width/2;
    new_pos += new_width/2;
}
//原始帧
无符号字符mYUVFrame[frameSize];
//作物位置
int lou_x,lou_y,hi_x,hi_y;
//框架的原始尺寸
int宽度、高度;
int new_width=(hi_x-lou x)+1;
int new_height=(hi_y-lou y)+1;
未签名字符*原始位置,*新位置;
//Y
原点=mYUVFrame+lo_y*宽度+lo_x;
新的_pos=mYUVFrame;
对于(int i=0;i您可以尝试以下方法:
此示例将相机帧发送到服务器

@Override 
        public void onPreviewFrame(byte[] data, Camera camera) {
        try { 
            byte[] baos = convertYuvToJpeg(data, camera);
            StringBuilder dataBuilder = new StringBuilder();
            dataBuilder.append("data:image/jpeg;base64,").append(Base64.encodeToString(baos, Base64.DEFAULT));
            mSocket.emit("newFrame", dataBuilder.toString());
        } catch (Exception e) {
           Log.d("########", "ERROR");
        } 
    } 

}; 


public byte[] convertYuvToJpeg(byte[] data, Camera camera) {

    YuvImage image = new YuvImage(data, ImageFormat.NV21,
            camera.getParameters().getPreviewSize().width, camera.getParameters().getPreviewSize().height, null); 

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    int quality = 20; //set quality
    image.compressToJpeg(new Rect(0, 0, camera.getParameters().getPreviewSize().width, camera.getParameters().getPreviewSize().height), quality, baos);//this line you can crop the image quality  


    return baos.toByteArray();
} 
或者在方法surfaceChanged中,您可以执行以下操作:

 for(Camera.Size size: mCamera.getParameters().getSupportedPreviewSizes()){
                Log.d("123###########", String.valueOf(size.width)+" x "+String.valueOf(size.height)); //Size preview

            }
            Camera.Parameters mParameters = mCamera.getParameters();

            mParameters.setPreviewSize(720, 480);////set Size preview available
            mCamera.setParameters(mParameters);

你找到过这个问题的答案吗?这正是我目前需要做的。如果你想在相机发送帧时进行裁剪,这可能会太慢。嗨,阿拉什,你的答案似乎很有希望,但代码没有真正起作用。你有没有在其他开源项目或教程中使用过它,这样我就可以看到上下文了你穿上它吗?