我有一个应用程序可以从使用ImageAvailableListener
录制的视频中捕获帧,并在帧顶部绘制水印。水印另存为PNG文件,并且为蓝色。但是,当我在捕获的帧上绘制水印时,它显示为红色。类似地,我使用蓝色绘制到画布上的所有矩形或线条都显示为红色,但是捕获的图像仍能保持其颜色良好。这是代码:
//Capture the image
final Image img = reader.acquireLatestImage();
if (img == null)
{
totalImages--;
return;
}
//Convert from Bytes into bitmap
byte[] data = getBytesFromYuv(img);
Bitmap.Config conf = Bitmap.Config.ARGB_8888;
Bitmap bitmap = Bitmap.createBitmap(imgWidth,imgHeight,conf);
ByteArrayOutputStream out = new ByteArrayOutputStream();
YuvImage yuvImage = new YuvImage(data, ImageFormat.NV21, imgWidth, imgHeight, null);
data = null;
yuvImage.compressToJpeg(new Rect(0, 0, imgWidth, imgHeight), JPEG_QUALITY, out);
byte[] imageBytes = out.toByteArray();
bitmap = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);
//Release the image
img.close();
//Create mutable bitmap and initiate canvas & paint
Bitmap mutableBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
Canvas canvas = new Canvas(mutableBitmap);
Paint p = new Paint();
//Set color to blue
p.setColor(Color.argb(255,0,0,255)); //Set color to BLUE
//...draw watermark, lines or rectangles here...
//Anything drawn using canvas/paint appears with blues/reds inverted
//but underlying frame captured retains its colors just fine.
在此代码之后,我使用其他一些功能将加水印的帧编码为YUV420以作其他用途-我认为问题可能出在此函数之内,但是鉴于捕获的视频帧仍能保持其颜色正常(仅覆盖了水印) ),我得出结论,这不是问题,并且没有包含此代码。
一个明显的快速解决方案是将水印PNG设置为红色,并将所有线/矩形绘制为红色(以便在绘制时显示为蓝色)-但我宁愿理解为什么会这样。我缺少明显的东西吗?
答案 0 :(得分:0)
通过捕获帧,应用水印然后将其保存为JPEG图像(在将其发送到视频编码器之前),我发现了问题所在。图像中的颜色看起来还不错,所以我知道奇怪的颜色是在视频编码过程之后发生的。
最后,由于缺少有关颜色格式的知识而发生了我的问题。视频使用的颜色格式与位图使用的颜色格式不同。我的视频编解码器使用YUV420格式,而我的位图使用的是ARGB_8888。解决我的问题的方法是将ColorMatrix应用于我的Paint对象,以考虑到在编码过程中将发生的颜色变化(即,将红色和绿色反转)。在开始在捕获的帧上方绘制之前,已插入此代码。
//Initiate color filter
ColorMatrix cm = new ColorMatrix();
float[] matrix = {
0, 0, 1, 0, 0, //Red (Grabbing blue values)
0, 1, 0, 0, 0, //Green
1, 0, 0, 0, 0, //Blue (Grabbing red values)
0, 0, 0, 1, 0 //Alpha
};
cm.set(matrix);
ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
//Set color filter
p.setColorFilter(f);
有关ColorMatrix的更多信息,请参阅: Android: ColorMatrix