Печать высококачественных документов Tiff из picturebox C#

Я использую WinForms. Моя программа открывает документы изображений .Tiff в Picturebox. Проблема, с которой я сталкиваюсь, заключается в печати высококачественных изображений tiff из изображения. Я пробовал и тестировал печать много раз. Когда документ печатается, слова не четкие / четкие, а немного размытые. Я также проверил свой принтер, чтобы проверить, есть ли проблема с моим принтером. Я распечатал обычный текстовый документ с помощью Microsoft Word, и он распечатался четко, так что это проблема с моим кодом.

Может ли кто-нибудь предоставить мне код для печати высококачественных изображений .tiff в моем фотобоксе? Нужно ли мне программно увеличивать DPI, чтобы повысить качество изображения?

введите описание изображения здесь

Это мой код.

    private void DVPrintDocument_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
    {

        e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
        e.Graphics.DrawImage(pictureBox1.Image, 25, 25, 800, 1050);

    }


    private void Print_button_Click(object sender, EventArgs e)
    {
        PrintPreviewDialog.Document = PrintDocument;
        PrintPreviewDialog.ShowDialog();
    }

Проанализировав мой код дальше, я думаю, что понял, почему мои изображения получаются размытыми. Когда я открываю документ Tiff, у меня в форме есть кнопки «назад» и «вперед» для нескольких страниц tiff. Я думаю, что в методе RefreshImage мои изображения становятся размытыми. Вот мой код:

    private int intCurrPage = 0; // defining the current page (its some sort of a counter)
    bool opened = false; // if an image was opened

    //-------------------------------------Next and Back Button-------------------------------------------------

    private void btn_Back_Click(object sender, EventArgs e)
    {
        if (opened) // the button works if the file is opened. you could go with button.enabled
        {
            if (intCurrPage == 0) // it stops here if you reached the bottom, the first page of the tiff
            { intCurrPage = 0; }
            else
            {
                intCurrPage--; // if its not the first page, then go to the previous page
                RefreshImage(); // refresh the image on the selected page
            }
        }
    }

    private void btn_Next_Click(object sender, EventArgs e)
    {
        if (opened) // the button works if the file is opened. you could go with button.enabled
        {
            if (intCurrPage == Convert.ToInt32(lblNumPages.Text)) // if you have reached the last page it ends here
                                                                  // the "-1" should be there for normalizing the number of pages
            { intCurrPage = Convert.ToInt32(lblNumPages.Text); }
            else
            {
                intCurrPage++;
                RefreshImage();
            }
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        var bm = new Bitmap(pictureBox1.Image);
        bm.SetResolution(600, 600);
        Image image1 = new Bitmap(bm);
        pictureBox1.Image = image1;
        pictureBox1.Refresh();
    }

    public void RefreshImage()
    {
        Image myImg; // setting the selected tiff
        Image myBmp; // a new occurance of Image for viewing

        myImg = System.Drawing.Image.FromFile(@lblFile.Text); // setting the image from a file

        int intPages = myImg.GetFrameCount(System.Drawing.Imaging.FrameDimension.Page); // getting the number of pages of this tiff
        intPages--; // the first page is 0 so we must correct the number of pages to -1
        lblNumPages.Text = Convert.ToString(intPages); // showing the number of pages
        lblCurrPage.Text = Convert.ToString(intCurrPage); // showing the number of page on which we're on

        myImg.SelectActiveFrame(System.Drawing.Imaging.FrameDimension.Page, intCurrPage); // going to the selected page

        myBmp = new Bitmap(myImg, pictureBox1.Width, pictureBox1.Height); // setting the new page as an image
        // Description on Bitmap(SOURCE, X,Y)

        pictureBox1.Image = myBmp; // showing the page in the pictureBox1

    }

введите описание изображения здесь


person taji01    schedule 09.10.2015    source источник
comment
Каково разрешение изображения TIFF? Вполне ожидаемо увидеть размытый текст на изображении в формате TIFF, если разрешение изображения значительно ниже разрешения принтера. То, как Word печатает текст (или даже ваша собственная программа Winforms) и то, как печатается растровое изображение, совершенно разные. Принтер (драйвер и оборудование) может легко печатать текст с полным разрешением, но не может добавлять информацию к растровым изображениям; они печатаются в любом их фактическом разрешении.   -  person Peter Duniho    schedule 10.10.2015
comment
Я добавил разрешение изображений TIFF. @PeterDuniho   -  person taji01    schedule 10.10.2015
comment
@taji01 Поделитесь одним из ваших изображений в формате TIFF для тестирования.   -  person Reza Aghaei    schedule 16.10.2015


Ответы (2)


    myBmp = new Bitmap(myImg, pictureBox1.Width, pictureBox1.Height); 
    pictureBox1.Image = myBmp;

Не смотрите дальше, вы масштабируете изображение, чтобы оно соответствовало окну изображения. Это отбрасывает много пикселей в исходном изображении, поле изображения намного меньше, чем изображение. Кстати, соотношение сторон правильное только случайно.

Самый простой способ - просто не масштабировать его самостоятельно и оставить это на усмотрение элемента управления PictureBox. Хотя это и замедляет рисование. Другой способ — просто сохранить ссылку на исходное изображение. Просто используйте переменную вместо свойства PictureBox.Image.

person Community    schedule 13.10.2015

Попробуйте этот код, который преобразует контекст PictureBox в растровое изображение и позволяет вам выбрать, на каком устройстве может происходить печать:

    private void myPrintDocument_PrintPage(System.Object sender, System.Drawing.Printing.PrintPageEventArgs e)
    {
        Bitmap myBitmap1 = new Bitmap(myPicturebox.Width, myPicturebox.Height);
        myPicturebox.DrawToBitmap(myBitmap1, new Rectangle(0, 0, myPicturebox.Width, myPicturebox.Height));
        e.Graphics.DrawImage(myBitmap1, 0, 0);
        myBitmap1.Dispose();
    }
    private void btnPrintPicture_Click(object sender, EventArgs e)
    {
        System.Drawing.Printing.PrintDocument myPrintDocument1 = new System.Drawing.Printing.PrintDocument();
        PrintDialog myPrinDialog1 = new PrintDialog();
        myPrintDocument1.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(myPrintDocument2_PrintPage);
        myPrinDialog1.Document = myPrintDocument1;

        if (myPrinDialog1.ShowDialog() == DialogResult.OK)
        {
           myPrintDocument1.Print();
        }
    }
person David BS    schedule 10.10.2015
comment
В методе btnPrintPicture под (myPrintDocument2_PrintPage) выдает ошибку. Ошибка: имя «myPrintDocument2_PrintPage» не существует в текущем контексте. Я не понимаю эту ошибку. Вы знаете, как я могу решить эту проблему? @Дэвид БС - person taji01; 13.10.2015
comment
@ taji01, убери 2 из этого образца. Используйте MyPrintDocument_PrintPage, как указано в подпрограмме в верхней части этого примера. - person David BS; 14.10.2015
comment
На самом деле это не решило проблему, но все же спасибо. Позже я обнаружил, что проблема заключалась в том, что когда я загружал изображение в ящик для изображений, оно становилось слегка размытым. Вы не могли бы сказать, просто взглянув на форму. Единственная причина, по которой я это обнаружил, заключалась в создании функции масштабирования в моем проекте. - person taji01; 14.10.2015