在YUV帧缓冲区中画线

李国帅 写于2010

Rgb的surface可以使用getdc得到,并把图形绘制在dc上,但是yuv不可以,需要使用直接写内存的方式。

http://www.fourcc.org/yuv.php

在维基 On wiki http://en.wikipedia.org/wiki/YUV,

while on fourcc.org http://www.fourcc.org/fccyvrgb.php。

yuv的前面是亮度数据一个点对应一个byte,后面的u变量4个点对应一个数据,v变量和u变量一样。



int src_off = 4 * sizeof(int);  //skip first 16 bytes,define by onself: size per line = 16BYTE
    int src_lineSize = *(int *)pOutData;
    int dst_off = 0;

    for (int i = 0; i < VideoHeight; i++)//亮度数据
    {
        memcpy(pBuffer + dst_off, pOutData + src_off, src_lineSize);
        dst_off += lPitch;
        src_off += src_lineSize;
    }

    YUV_drawLine(pBuffer, VideoWidth, VideoHeight, lPitch, 100, 100, 200, 200, 200);

    for (int i = 0; i < VideoHeight; i++)//v变量和u变量
    {
        memcpy(pBuffer + dst_off, pOutData + src_off, src_lineSize / 2);
        dst_off += lPitch / 2;
        src_off += src_lineSize / 2;
    }

void YUV_drawLine(unsigned char *dst_buf, int w, int h, int lpitch, int x0, int y0, int x1, int y1, unsigned char color)
{
    unsigned char *xoff;
    unsigned char *yoff;
    int rect_width = x1 - x0;
    int rect_height = y1 - y0;

    xoff = dst_buf + y0*lpitch + x0;
    memset(xoff, color, rect_width);

    xoff = dst_buf + y1*lpitch + x0;
    memset(xoff, color, rect_width);

    for (int i = 0; i < rect_height; i++)
    {
        yoff = dst_buf + (i + y0)*lpitch + x0;
        *yoff = color;

        yoff = dst_buf + (i + y0)*lpitch + x1;
        *yoff = color;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要获取Camera2的YUV,您需要创建一个`ImageReader`对象,并在`ImageReader.OnImageAvailableListener`回调获取数据。以下是使用Camera2 API获取YUV的基本步骤: 1. 创建`ImageReader`对象: ``` ImageReader imageReader = ImageReader.newInstance(width, height, ImageFormat.YUV_420_888, 1); ``` 这里的`width`和`height`是您要获取的的分辨率。 2. 在`ImageReader.OnImageAvailableListener`回调获取数据: ``` imageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() { @Override public void onImageAvailable(ImageReader reader) { Image image = reader.acquireLatestImage(); if (image != null) { Image.Plane[] planes = image.getPlanes(); ByteBuffer yBuffer = planes[0].getBuffer(); ByteBuffer uBuffer = planes[1].getBuffer(); ByteBuffer vBuffer = planes[2].getBuffer(); // TODO: 处理YUV数据 image.close(); } } }, null); ``` 在这个回调,您可以调用`acquireLatestImage()`方法来获取最新的数据。然后,您可以通过`Image.getPlanes()`方法获取数据的各个平面,包括Y、U和V平面。最后,您可以从每个平面的`ByteBuffer`获取相应的数据。 3. 启动相机预览: ``` CameraDevice cameraDevice = // 获取相机设备 Surface surface = imageReader.getSurface(); CaptureRequest.Builder requestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); requestBuilder.addTarget(surface); cameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() { @Override public void onConfigured(CameraCaptureSession session) { try { session.setRepeatingRequest(requestBuilder.build(), null, null); } catch (CameraAccessException e) { e.printStackTrace(); } } }, null); ``` 这里,您需要将`ImageReader`的`Surface`添加为相机预览的目标,并使用`CameraCaptureSession`启动相机预览。 这就是使用Camera2 API获取YUV的基本步骤。请注意,您还需要处理数据的格式转换和显示等问题,具体取决于您的应用程序需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微澜-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值