使用指针取得Color的RGB值和透明度值

如题:

使用指针来取得颜色的值

    CGFloat red, green, blue, alpha;
    
    [self.sliderView.uiView.backgroundColor getRed:&red green:&green blue:&blue alpha:&alpha];

首先定义四个CGFloat变量,调用getRed:green:blue:alpha:方法,将四个变量的地址传递过去就可以了。之前我用

const CGFloat *colors = CGColorGetComponents(self.sliderView.uiView.backgroundColor.CGColor);

发现取[UIColor whiter]会有问题。

所以建议大家使用getRed:green:blue:alpha:方法。

附上一张效果图吧

项目的地址:

链接: http://pan.baidu.com/s/1gdnLScV 密码: t7g7

好的,我可以为您提供一个基于ffmpeg的C语言函数来实现您的要求。首先,需要包含头文件 ```c #include <libavcodec/avcodec.h> #include <libavutil/imgutils.h> #include <libswscale/swscale.h> ``` 然后,定义一个函数如下: ```c void add_subtitle_to_yuv_frame(uint8_t* data, int width, int height, uint8_t* subtitle, int size, int color, int subtitle_x, int subtitle_y, int subtitle_alpha) { AVFrame* frame = av_frame_alloc(); if (!frame) { fprintf(stderr, "Error allocating AVFrame\n"); return; } frame->format = AV_PIX_FMT_YUV420P; frame->width = width; frame->height = height; av_frame_get_buffer(frame, 32); if (!frame->data[0]) { fprintf(stderr, "Error allocating frame data\n"); av_frame_free(&frame); return; } // 将YUV数据拷贝到AVFrame中 int ret = av_image_copy(frame->data, frame->linesize, (const uint8_t**) &data, (const int[]) { width, width / 2, width / 2 }, AV_PIX_FMT_YUV420P, width, height); if (ret < 0) { fprintf(stderr, "Error copying YUV data to AVFrame: %s\n", av_err2str(ret)); av_frame_free(&frame); return; } // 添加字幕 AVCodec* codec = avcodec_find_encoder(AV_CODEC_ID_SUBRIP); if (!codec) { fprintf(stderr, "Error finding encoder for AV_CODEC_ID_SUBRIP\n"); av_frame_free(&frame); return; } AVCodecContext* codec_context = avcodec_alloc_context3(codec); if (!codec_context) { fprintf(stderr, "Error allocating AVCodecContext\n"); av_frame_free(&frame); return; } codec_context->width = width; codec_context->height = height; codec_context->time_base = (AVRational) { 1, 1000 }; codec_context->pix_fmt = AV_PIX_FMT_YUV420P; codec_context->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; ret = avcodec_open2(codec_context, codec, NULL); if (ret < 0) { fprintf(stderr, "Error opening codec: %s\n", av_err2str(ret)); avcodec_free_context(&codec_context); av_frame_free(&frame); return; } AVPacket packet; av_init_packet(&packet); packet.data = NULL; packet.size = 0; ret = avcodec_encode_subtitle2(codec_context, &packet, (const AVSubtitle*) subtitle, AV_TIME_BASE_Q); if (ret < 0) { fprintf(stderr, "Error encoding subtitle: %s\n", av_err2str(ret)); av_packet_unref(&packet); avcodec_free_context(&codec_context); av_frame_free(&frame); return; } // 将字幕渲染到AVFrame中 AVSubtitleRect* rect = ((AVSubtitle*) subtitle)->rects[0]; uint8_t* alpha = (uint8_t*) malloc(rect->w * rect->h); for (int i = 0; i < rect->w * rect->h; i++) { alpha[i] = subtitle_alpha; } int x, y; uint8_t* src = rect->data[0]; uint8_t* dst = frame->data[0] + subtitle_y * frame->linesize[0] + subtitle_x; for (y = 0; y < rect->h; y++) { for (x = 0; x < rect->w; x++) { if (*src == 0) { src++; dst++; } else { int a = alpha[x + y * rect->w]; int r = (color >> 16) & 0xFF; int g = (color >> 8) & 0xFF; int b = color & 0xFF; int y = 0.299 * r + 0.587 * g + 0.114 * b; int u = -0.14713 * r - 0.28886 * g + 0.436 * b + 128; int v = 0.615 * r - 0.51498 * g - 0.10001 * b + 128; dst[0] = y; dst[1] = u; dst[2] = v; src++; dst += 3; } } dst += frame->linesize[0] - rect->w * 3 + subtitle_x * 3; } // 将AVFrame中的YUV数据拷贝回原始数据 ret = av_image_copy((uint8_t**) &data, (int[]) { width, width / 2, width / 2 }, frame->data, frame->linesize, AV_PIX_FMT_YUV420P, width, height); if (ret < 0) { fprintf(stderr, "Error copying AVFrame data to YUV data: %s\n", av_err2str(ret)); } // 释放资源 av_packet_unref(&packet); avcodec_free_context(&codec_context); av_frame_free(&frame); } ``` 这个函数主要功能就是将YUV数据拷贝到AVFrame中,然后添加字幕并渲染到AVFrame中,最后将AVFrame中的YUV数据拷贝回原始数据。字幕的添加和渲染使用ffmpeg的AVCodecContext和AVSubtitleRect结构体来实现。 使用方法如下: ```c uint8_t* data = ...; // YUV数据指针 int width = ...; // 视频宽度 int height = ...; // 视频高度 uint8_t* subtitle = ...; // 字幕指针 int size = ...; // 字幕大小 int color = ...; // 字幕颜色(RGB24格式) int subtitle_x = ...; // 字幕X坐标 int subtitle_y = ...; // 字幕Y坐标 int subtitle_alpha = ...; // 字幕透明度 add_subtitle_to_yuv_frame(data, width, height, subtitle, size, color, subtitle_x, subtitle_y, subtitle_alpha); ``` 需要注意的是,字幕的指针必须是AVSubtitle类型的指针,可以使用ffmpeg的AVSubtitleRect结构体来创建。 希望这个函数能够满足您的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值