In my WPF application there is a Canvas containing a MediaElement and some other stuff. I need to limit overall brightness, calculated as the average of all RGB values of all pixels inside the canvas. This average value should not exceed let's say 128 (which is half brightness). Currently I have a 50ms timer which calls the renderTargetBitmap.Render(canvas) to catch the image, meausures the image and finally sets the canvas opacity accordingly:
void TimerOpac_Tick(object sender, EventArgs e)
{
RenderTargetBitmap bmp = new RenderTargetBitmap(MyCanvas.RenderSize.Width MyCanvas.RenderSize.Height, 96, 96, System.Windows.Media.PixelFormats.Pbgra32);
bmp.Render(MyCanvas);
int bytesPerPixel = 4;
byte[] bytes = new byte[bmp.PixelWidth * bmp.PixelHeight * bytesPerPixel];
bmp.CopyPixels(bytes, bmp.PixelWidth * bytesPerPixel, 0);
int AvgLimit = 128;
MyCanvas.Opacity = MeasureAvgAndCalcLimitingOpacity(bytes, AvgLimit);
}
This works but has a delay, it's not frame by frame. Is there a better way, hopefully in WPF but maybe also using something at lower level?
question from:
https://stackoverflow.com/questions/65905777/limiting-the-average-brightness-of-a-canvas-containing-also-a-mediaelement-fram 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…