|
@@ -248,8 +248,12 @@ bool ShaderYUV420::convertRGBAToYUV420(const QImage& image, Image_YUV420& yuvDat
|
|
|
{
|
|
{
|
|
|
int width = image.width();
|
|
int width = image.width();
|
|
|
int height = image.height();
|
|
int height = image.height();
|
|
|
- const int ySize = yuvData.width * yuvData.height;
|
|
|
|
|
- const int uvSize = ySize / 4;
|
|
|
|
|
|
|
+
|
|
|
|
|
+ // 使用当前图像的宽高计算 Y/UV 分量大小,避免使用旧的 yuvData 宽高导致越界
|
|
|
|
|
+ const int ySize = width * height;
|
|
|
|
|
+ const int chromaWidth = (width + 1) / 2;
|
|
|
|
|
+ const int chromaHeight = (height + 1) / 2;
|
|
|
|
|
+ const int uvSize = chromaWidth * chromaHeight;
|
|
|
|
|
|
|
|
QImage image_rgb(width, height, QImage::Format_RGB888);
|
|
QImage image_rgb(width, height, QImage::Format_RGB888);
|
|
|
|
|
|
|
@@ -268,12 +272,16 @@ bool ShaderYUV420::convertRGBAToYUV420(const QImage& image, Image_YUV420& yuvDat
|
|
|
int b = color.blue();
|
|
int b = color.blue();
|
|
|
|
|
|
|
|
int yIndex = y * width + x;
|
|
int yIndex = y * width + x;
|
|
|
- yuvData.yData[yIndex] = static_cast<unsigned char>((0.257 * r) + (0.504 * g) + (0.098 * b) + 16);
|
|
|
|
|
|
|
+ if (yIndex >= 0 && yIndex < ySize) {
|
|
|
|
|
+ yuvData.yData[yIndex] = static_cast<unsigned char>((0.257 * r) + (0.504 * g) + (0.098 * b) + 16);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
if (y % 2 == 0 && x % 2 == 0) {
|
|
if (y % 2 == 0 && x % 2 == 0) {
|
|
|
- int uvIndex = (y / 2) * (width / 2) + (x / 2);
|
|
|
|
|
- yuvData.uData[uvIndex] = static_cast<unsigned char>((-0.148 * r) - (0.291 * g) + (0.439 * b) + 128);
|
|
|
|
|
- yuvData.vData[uvIndex] = static_cast<unsigned char>((0.439 * r) - (0.368 * g) - (0.071 * b) + 128);
|
|
|
|
|
|
|
+ int uvIndex = (y / 2) * chromaWidth + (x / 2);
|
|
|
|
|
+ if (uvIndex >= 0 && uvIndex < uvSize) {
|
|
|
|
|
+ yuvData.uData[uvIndex] = static_cast<unsigned char>((-0.148 * r) - (0.291 * g) + (0.439 * b) + 128);
|
|
|
|
|
+ yuvData.vData[uvIndex] = static_cast<unsigned char>((0.439 * r) - (0.368 * g) - (0.071 * b) + 128);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|