Неужели кто-нибудь решил эту проблему раньше? Мне нужен простой и быстрый способ конвертировать буфер QImage :: bits() из формата RGB32 в формат YUV420P. Вы можете мне помочь?Преобразование QImage в формат пикселя YUV420P
1
A
ответ
4
libswscale, часть проекта ffmpeg имеет оптимизированные подпрограммы для преобразования цветов, масштабирования и фильтрации. Если вы действительно хотите скорость, я бы предложил использовать ее, если вы не можете добавить дополнительную зависимость. На самом деле я не проверял этот код, но вот общая идея:
QImage img = ... //your image in RGB32
//allocate output buffer. use av_malloc to align memory. YUV420P
//needs 1.5 times the number of pixels (Cb and Cr only use 0.25
//bytes per pixel on average)
char* out_buffer = (char*)av_malloc((int)ceil(img.height() * img.width() * 1.5));
//allocate ffmpeg frame structures
AVFrame* inpic = avcodec_alloc_frame();
AVFrame* outpic = avcodec_alloc_frame();
//avpicture_fill sets all of the data pointers in the AVFrame structures
//to the right places in the data buffers. It does not copy the data so
//the QImage and out_buffer still need to live after calling these.
avpicture_fill((AVPicture*)inpic,
img.bits(),
AV_PIX_FMT_ARGB,
img.width(),
img.height());
avpicture_fill((AVPicture*)outpic,
out_buffer,
AV_PIX_FMT_YUV420P,
img.width(),
img.height());
//create the conversion context. you only need to do this once if
//you are going to do the same conversion multiple times.
SwsContext* ctx = sws_getContext(img.width(),
img.height(),
AV_PIX_FMT_ARGB,
img.width(),
img.height(),
AV_PIX_FMT_YUV420P,
SWS_BICUBIC,
NULL, NULL, NULL);
//perform the conversion
sws_scale(ctx,
inpic->data,
inpic->linesize,
0,
img.height(),
outpic->data,
outpic->linesize);
//free memory
av_free(inpic);
av_free(outpic);
//...
//free output buffer when done with it
av_free(out_buffer);
Как я уже сказал, я не проверял этот код, он может потребовать некоторые хитрости, чтобы заставить его работать.
Смежные вопросы
- 1. Преобразование QImage в формат изображения ROS
- 2. Преобразование координаты opengl в формат пикселя
- 3. yuv420p to rgb преобразование изображения
- 4. Подходит QImage формат
- 5. Поврежденный QImage из необработанных данных пикселя
- 6. RGB32 в YUV420p
- 7. Несовместимый формат пикселей YUV420P с mjpeg
- 8. Преобразование QImage в оттенки серого
- 9. Преобразование QImage в C# Изображение
- 10. (Java) Преобразование 1x1 пикселя в 3x3 пикселя
- 11. преобразование пикселя в пиксель
- 12. Преобразование cv :: mat в QImage с использованием QImage :: loadFromData
- 13. Более быстрое преобразование BGR, упакованное в формат прямоугольного пикселя RGB
- 14. Преобразование буфера данных (YUV) в QImage (RGBA)
- 15. Формат пикселя RGB в freetype
- 16. Преобразование формата пикселя поверхности SDL
- 17. Объединить несколько моно QImage в цвет QImage
- 18. Преобразование RGB-кадров в YUV420P с использованием FFmpeg/C++
- 19. Быстрое преобразование изображения с уровня серого в QImage
- 20. Преобразование HBITMAP в QImage без использования QPixmap
- 21. Преобразование QString/зЬй :: строки в QImage
- 22. Преобразование 16-битных оттенков серого в QImage
- 23. Cocos2D 0.99.5 Формат пикселя CCDirector?
- 24. Какой смысл непрозрачного формат пикселя
- 25. QtOpenGL Загрузить формат obj с текстурой QImage
- 26. Как получить правильный компонент цвета, включая альфа-значение пикселя QImage?
- 27. YUV420P to JPEG от ffmpeg
- 28. Быстрое преобразование YUV420P в RGBA на iOS с использованием CPU
- 29. Почему декодер MediaCodec не выводит унифицированный формат YUV (например, YUV420P)?
- 30. Преобразование QImage (иконка) в формате GRAYSCALE, сохраняя при этом фон