2012-03-08 1 views
6

Я работаю над программой на C#, которая снимает скриншоты зелья экрана пользователя. Для большинства пользователей он работает так, как должен, но я недавно столкнулся с одной проблемой. Кажется, что (по крайней мере) один пиксельный цвет, который всегда выглядит прозрачным на выходном изображении. Любой экземпляр цвета # 0D0B0C (RGB 13, 11, 12) выглядит прозрачным в сохраненном png. Это с PixelFormat, установленным в Format32bppArgb. Если я настрою его на Format32bppRgb или Format24bppRgb, тот же цвет пикселя появится в черном в сохраненном png.C# Объект Bitmap, цвет выглядит прозрачным

Я понятия не имею, что может быть причиной этого, но единственное, что я смог сделать, чтобы «исправить», это очистить графический объект до этого цвета, прежде чем делать CopyFromScreen(). Я не хочу этого делать, хотя по нескольким причинам. Во-первых, я не знаю, является ли это единственным цветом, у которого есть проблема (с 16 777 216 цветами есть немало возможностей), а во-вторых, я ненавижу исправления взлома, это похоже на исправление взлома.

Может ли кто-нибудь пролить свет на то, что может вызвать эту проблему? Я запутался с PixelFormat в создании растрового изображения и с помощью метода CopyPixelOperation в методе CopyFromScreen ничего не работает. Тот факт, что очистка графического объекта от этого цвета «исправляет», кажется, говорит мне, что прозрачность исходит от самих экранных данных, но это не имеет смысла. Я слишком долго смотрел на это, я думаю, мне нужна новая перспектива. Если кто-нибудь знает, почему это может произойти, я бы хотел это услышать. Спасибо.

ответ

-2

Похоже, у вас на экране плохой пиксель.

+2

Все, что вам нужно сделать, чтобы диагностировать перемещение формы на экране и посмотреть, не исчезнет ли она. Я очень серьезно сомневаюсь, что проблема ... –

+0

Это несколько пикселей и происходит на разных экранах/компьютерах, и это всегда только тот цвет. Я думал, проблема была исправлена, но один из пользователей программы сказал мне, что это все еще происходит. – HaLo2FrEeEk

1

Возможно ли значение альфы 0? вы проверили?

Поскольку большой формат между Format32bppArgb и Format32bppRgb заключается в том, что второй формат не знает альфа-канал.

+0

Экран печати приводит к правильному изображению, и, как я сказал в OP, когда я устанавливаю его в Format32bppRgb, те же пиксели кажутся черными (когда они должны быть # 0D0B0C). Ни один из других пикселей не выглядит прозрачным, и это звучит как нечто, что будет присутствовать и на экране печати. – HaLo2FrEeEk

+0

как вы снимаете скриншоты? – cansik

+0

Как я уже сказал в OP, я использую графический объект и CopyFromScreen(). – HaLo2FrEeEk

0

Была ли такая же проблема при рендеринге управления растровым изображением. Удалось исправить это, создав еще одно растровое изображение с PixelFormat.Format32bppRgb и BitBlt'ing его ему. Надеюсь это поможет!

public class ScreenCapture 
{ 
    [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")] 
    private static extern bool BitBlt(
     IntPtr hdcDest, // handle to destination DC 
     int nXDest, // x-coord of destination upper-left corner 
     int nYDest, // y-coord of destination upper-left corner 
     int nWidth, // width of destination rectangle 
     int nHeight, // height of destination rectangle 
     IntPtr hdcSrc, // handle to source DC 
     int nXSrc, // x-coordinate of source upper-left corner 
     int nYSrc, // y-coordinate of source upper-left corner 
     System.Int32 dwRop // raster operation code 
     ); 


    /// <summary> 
    /// Returns an image of the control 
    /// </summary> 
    /// <param name="control">The control object whose image is wanted</param> 
    /// <returns>Image of the control</returns> 
    /// <remarks>This is based on code from 
    /// http://www.dotnet247.com/247reference/a.aspx?u=http://www.c-sharpcorner.com/Code/2002/April/ScreenCaptureUtility.asp 
    /// with changes made to prevent 0D0B0C transparency issues</remarks> 
    public static Image GetControlImage(Control control) 
    { 
     Graphics g1 = control.CreateGraphics(); 

     // Create a bitmap the same size as the control 
     Image MyImage = new Bitmap(control.ClientRectangle.Width, control.ClientRectangle.Height, PixelFormat.Format32bppRgb); 
     (MyImage as Bitmap).SetResolution(g1.DpiX, g1.DpiY); 

     Graphics g2 = Graphics.FromImage(MyImage); 

     IntPtr dc1 = g1.GetHdc(); 
     IntPtr dc2 = g2.GetHdc(); 

     // BitBlt from one DC to the other 
     BitBlt(dc2, 0, 0, control.ClientRectangle.Width, control.ClientRectangle.Height, dc1, 0, 0, 13369376); 

     // Release Device Contexts 
     g1.ReleaseHdc(dc1); 
     g2.ReleaseHdc(dc2); 

     // This statement runs the garbage collector manually 
     // (If not present, uses up large amounts of memory...) 
     GC.Collect(); 

     return MyImage; 
    } 
} 
0

я просто должен был просить CopyFromScreen в растровое изображение, которое не имеет альфа-канал вообще, такие как:

Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height,  System.Drawing.Imaging.PixelFormat.Format32bppRgb); 
Graphics graphics = Graphics.FromImage(bitmap as Image); 
graphics.CopyFromScreen(bounds.Location, new Point(0, 0), bitmap.Size); 

Я подтвердил, что это имеет прозрачные отверстия пикселя с Format32bppArgb, но не с Format32bppRgb

Смежные вопросы