在winform c#中去除捕捉图像背景中的黑暗

Posted

技术标签:

【中文标题】在winform c#中去除捕捉图像背景中的黑暗【英文标题】:Remove darkness in capturing image background in winform c# 【发布时间】:2016-06-01 22:06:14 【问题描述】:

我从事图像捕获窗口应用程序的工作。当我通过窗口平板电脑中的应用程序捕获图像时,图像质量低并且在捕获的图像背景中显示黑暗。当我用平板电脑拍摄图像时,图像质量很好。 我的代码中缺少什么/问题? 我已经使用了你的代码共享...

private void cam_NewFrame(object sender, NewFrameEventArgs eventArgs)
        
           Bitmap bitmap = (Bitmap)eventArgs.Frame.Clone();                     
           
         ImgContainer.Image = b;
            
            
        
    private void btnKeep_Click(object sender, EventArgs e)
            
    int width = 457;
                int height = 350;
    
                Image tmpimg = ImgContainer.Image;                
                System.Drawing.Bitmap b = new System.Drawing.Bitmap(ImgContainer.Image, width, height);
                System.Drawing.Graphics gr = System.Drawing.Graphics.FromImage(b);
                gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                gr.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
                System.Drawing.Rectangle rectDestination = new System.Drawing.Rectangle(0, 0, width, height);
                System.Drawing.Imaging.ImageCodecInfo codec = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders()[1];
                System.Drawing.Imaging.EncoderParameters eParams = new System.Drawing.Imaging.EncoderParameters(1);
                eParams.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L);
                string ImagePath = Guid.NewGuid().ToString();
                string imagefullpath = System.AppDomain.CurrentDomain.BaseDirectory + "imageFolder\\" + ImagePath + ".jpg";                  
                b.Save(imagefullpath);
    

显示你被应用程序图像捕获............

显示你被平板电脑捕获............

请给我任何想法和解决方案来消除应用程序捕获的黑暗(上图)。

【问题讨论】:

只是猜测:平板电脑图像大小 = 3264x1826;您设置457x350 并获得低质量图像 我知道,你是对的,但是 3264x1826 被转换成 457x350 然后质量不会改变,只会改变大小。 您是说...您的应用程序在Windows 平板电脑上运行,区别在于平板电脑自己的照片软件与您的软件在同一平板电脑上拍摄的图像?只是不清楚您是否使用了 2 种不同的硬件。还有为什么要标记Flash?其中一张照片是否使用了闪光灯?您真正的问题是如何在您自己的应用程序中启用相机闪光灯?否则你在下面有一个正确的答案。要么接受它,要么编辑您的问题,以便更清楚地了解事实和目标。 【参考方案1】:

您可以使用 DrawImageImageAttributes 实例来更改伽玛。我发现0.5f 工作:

这是一个将伽玛值应用于位图并返回修改后的位图的函数。这取决于你..:

确保不泄露资源 在为用户提供轨迹栏以找到合适的值时,确保始终将伽玛应用于原始图像,而不是重复应用于同一个位图。

功能:

public static Bitmap ApplyGamma(Bitmap bmp0, float gamma)

    Bitmap bmp1 = new Bitmap(bmp0.Width, bmp0.Height);
    using (Graphics g = Graphics.FromImage(bmp1))
    
        ImageAttributes attributes = new ImageAttributes();
        attributes.SetGamma(gamma, ColorAdjustType.Bitmap);
        g.DrawImage(bmp0, new Rectangle(0, 0, bmp0.Width, bmp0.Height),
                    0, 0, bmp0.Width, bmp0.Height, GraphicsUnit.Pixel, attributes);
    
    return bmp1;

我使用的调用代码:

Image img = Image.FromFile(yourImage);            // some image to use
float gamma = (float)(trackBar1.Value / 10f);     // a trackbar to test
Text = "Gamma = " + gamma;                        // a control display
pictureBox1.Image = ApplyGamma((Bitmap)img, gamma);

如果您还想更改对比度和/或亮度,可以使用ColorMatrix。示例见here!

【讨论】:

以上是关于在winform c#中去除捕捉图像背景中的黑暗的主要内容,如果未能解决你的问题,请参考以下文章

C# WinForm - 在标签上切换背景图像

Winforms c#从弹出表单更改父表单的背景图像

C# WINFORM中捕捉界面中按键ESC

c#中(winform)如何去掉button边框颜色?

c# winform背景图片超过屏幕分辨率怎么办

去除 OCR 图像处理中的背景颜色