Visual Studio C# Захват экрана для печати и / или сохранения в формате PDF с отображением нежелательных белых пикселей - PullRequest
0 голосов
/ 25 февраля 2020

Я использую Visual Studio C# Снимок экрана для печати и / или также сохранения в формате PDF.

У меня возникла проблема с изображением, после захвата которого отображаются нежелательные белые пиксели.

Пожалуйста, см. Следующее изображение:

kotrv01whitepixels

Не имеет значения, если я сделаю снимок экрана, тогда go для печати или захвата экрана и go для сохранения в формате PDF. Если я снимаю экран вручную через Windows, у меня нет проблем. Я не знаю, что не так с кодом, поэтому я пытаюсь выяснить, может ли кто-нибудь понять, что не так.

Спасибо, код указан ниже:

 private void Printbutton_Click(object sender, EventArgs e)
    {
        //Hide Buttons When Start Print
        quitbutton.Visible = false;
        printbutton.Visible = false;
        savetopdfbutton.Visible = false;
        uploadcharacterportraitbutton.Visible = false;
        hitsbutton.Visible = false;
        submittoserverbutton.Visible = false;


        //print button
        Graphics g = this.CreateGraphics();
        bmp = new Bitmap(this.Size.Width, this.Size.Height, g);
        Graphics mg = Graphics.FromImage(bmp);
        mg.CopyFromScreen(this.Location.X, this.Location.Y, 0, 0, this.Size);
        printPreviewDialog1.ShowDialog();

        //Show Buttons After Print
        quitbutton.Visible = true;
        printbutton.Visible = true;
        savetopdfbutton.Visible = true;
        uploadcharacterportraitbutton.Visible = true;
        hitsbutton.Visible = true;
        submittoserverbutton.Visible = true;
    }

    private void Savetopdfbutton_Click(object sender, EventArgs e)
    {
        //savetoPDF Button

        //Hide Buttons When Start Capture
        quitbutton.Visible = false;
        printbutton.Visible = false;
        savetopdfbutton.Visible = false;
        uploadcharacterportraitbutton.Visible = false;
        hitsbutton.Visible = false;
        submittoserverbutton.Visible = false;



        // Call your captureScreen() function
        captureScreen();

        // Create new pdf document and page
        PdfDocument doc = new PdfDocument();
        PdfPage oPage = new PdfPage();

        // Add the page to the pdf document and add the captured image to it
        doc.Pages.Add(oPage);
        XGraphics xgr = XGraphics.FromPdfPage(oPage);
        XImage img = XImage.FromFile(@"C:\Temp\test.png");
        xgr.DrawImage(img, 0, 0);

        saveFileDialog1.Filter = ("PDF File|*.pdf");
        DialogResult btnSave = saveFileDialog1.ShowDialog();
        if (btnSave.Equals(DialogResult.OK))
        {
            doc.Save(saveFileDialog1.FileName);
            doc.Close();
        }

        // I used the Dispose() function to be able to 
        // save the same form again, in case some values have changed.
        // When I didn't use the function, a GDI+ error occurred.
        img.Dispose();

        //Show Buttons After Screen Capture Finished
        quitbutton.Visible = true;
        printbutton.Visible = true;
        savetopdfbutton.Visible = true;
        uploadcharacterportraitbutton.Visible = true;
        hitsbutton.Visible = true;
        submittoserverbutton.Visible = true;

    }

I Необходимо уточнить, что это не похоже на аналогичную проблему при сравнении с нежелательными белыми пикселями на основе свойства TransparencyKey, хотя я предоставил ссылку для справки:

C# появляются белые или черные нежелательные пиксели на изображении

Пожалуйста, дайте мне знать, что я делаю не так. Я перепробовал все на этом этапе, я собираюсь перейти к другим возможным решениям.

ОБНОВЛЕНИЕ 21.03.2020: @Kyle Wang

Я попытался использовать этот код и сделал некоторые изменения. Я все еще получил те же результаты со следующим:

//print button bmp = new Bitmap(this.ClientRectangle.Width, this.ClientRectangle.Height); Graphics g = Graphics.FromImage(bmp); g.CopyFromScreen(new Point(this.Location.X + 1, this.Location.Y + (this.Height - this.ClientRectangle.Height) + 1), new Point(0, 0), bmp.Size);

1 Ответ

0 голосов
/ 26 февраля 2020

Возможно, вы можете попытаться использовать свойство ClientRectangle, чтобы получить прямоугольник, представляющий клиентскую область элемента управления, вместо this.Size.

Если это не решит проблему, вы можете попробовать вручную изменить параметр Point в CopyFromScreen в соответствии с вашими потребностями.

Bitmap bit = new Bitmap(this.ClientRectangle.Width, this.ClientRectangle.Height);
Graphics g = Graphics.FromImage(bit);
g.CopyFromScreen(new Point(this.Location.X + 1, this.Location.Y + (this.Height - this.ClientRectangle.Height) + 1), new Point(0, 0), bit.Size);
...