c# - मतलब - संसद पर कविता




एक XPS फ़ाइल को एक छवि को उच्च गुणवत्ता में बदलने के लिए कैसे(धूमिल कम रिज़ॉल्यूशन के बजाय)? (2)

मैं WPFS के साथ एक एक्सपीएस बदलने की कोशिश कर रहा हूँ।

विचार यह है कि इन छवियों को चांदी की रोशनी 4 के साथ लोड किया जा सकता है, इसके लिए मैं निम्न कोड का उपयोग कर रहा हूं:

 // XPS Document
            XpsDocument xpsDoc = new XpsDocument(xpsFileName, System.IO.FileAccess.Read);
            FixedDocumentSequence docSeq = xpsDoc.GetFixedDocumentSequence();

        // The number of pages
        PageCount = docSeq.References[0].GetDocument(false).Pages.Count;

        DocumentPage sizePage = docSeq.DocumentPaginator.GetPage(0);
        PageHeight = sizePage.Size.Height;
        PageWidth = sizePage.Size.Width;
        // Scale dimensions from 96 dpi to 600 dpi.
        double scale = 300/ 96;

        // Convert a XPS page to a PNG file
        for (int pageNum = 0; pageNum < PageCount; pageNum++)
        {
            DocumentPage docPage = docSeq.DocumentPaginator.GetPage(pageNum);
            BitmapImage bitmap = new BitmapImage();
            RenderTargetBitmap renderTarget =
                new RenderTargetBitmap((int)(scale * (docPage.Size.Height + 1)),
                                                               (int)(scale * (docPage.Size.Height + 1)),
                                                               scale * 96,
                                                               scale * 96, PixelFormats.Pbgra32);
            renderTarget.Render(docPage.Visual);


            PngBitmapEncoder encoder = new PngBitmapEncoder();

            encoder.Frames.Add(BitmapFrame.Create(renderTarget));

            FileStream pageOutStream = new FileStream(name + ".Page" + pageNum + ".png", FileMode.Create, FileAccess.Write);
            encoder.Save(pageOutStream);
            pageOutStream.Close();

यह कोड http://xpsreader.codeplex.com/ एक XPS दस्तावेज़ को रूपांतरित करने के लिए एक प्रोजेक्ट से लिया गया है। बहुत अच्छा काम करता है! लेकिन समस्या यह है कि छवि कम संकल्प और धुँधली है। मैंने शोध किया और पाया कि RenderTargetBitmap और इस पृष्ठ को ढूंढें: http://www.codeproject.com/Questions/213737/Render-target-bitmap-quality-issues

यहां मुद्दा यह है कि वह हार्डवेयर रेंडरटैबैल्टबिटमैप रेंडरिंग का उपयोग नहीं करता है।

एक समाधान यह करने के लिए WPF के साथ डायरेक्टएक्स का उपयोग करना है, लेकिन मुझे यह करने का सही तरीका दिखाने के लिए कोई स्पष्ट उदाहरण नहीं मिला है।

मैं सुझावों की सराहना करता हूं अग्रिम में धन्यवाद।

अपडेट: मैं एक्सपीएस दस्तावेज़ संलग्न करता हूं, मैं छवि बदलने की कोशिश कर रहा हूं कृपया test.xps डाउनलोड करें


Sourceforge.net पर xps2img नामित एक प्रोजेक्ट है जो कि एक एक्सपीएस को इमेज में परिवर्तित करता है। इसे सी # में बनाया गया है और इसमें स्रोत कोड भी शामिल है। इसकी जांच - पड़ताल करें। यह आपको जो चाहें हासिल करने में सहायता करेगा।

http://sourceforge.net/projects/xps2img/files/


मैंने इस पोस्ट में और कई अन्य लोगों में देखा है कि लोगों को डॉक्यूमेंट पेज के इमेज के रूपांतरण के साथ समस्या है और इसे एचडीडी पर सहेजते हैं। इस पद्धति ने सभी पृष्ठों को दस्तावेज़ व्यूअर से लिया और उन्हें एचडीडी पर जेपीजी छवियों के रूप में बचा लिया।

public void SaveDocumentPagesToImages(IDocumentPaginatorSource document, string dirPath)
    {
        if (string.IsNullOrEmpty(dirPath)) return;

        if (dirPath[dirPath.Length - 1] != '\\')
            dirPath += "\\";

        if (!Directory.Exists(dirPath)) return;

        MemoryStream[] streams = null;
        try
        {
            int pageCount = document.DocumentPaginator.PageCount;
            DocumentPage[] pages = new DocumentPage[pageCount];
            for (int i = 0; i < pageCount; i++)
                pages[i] = document.DocumentPaginator.GetPage(i);

            streams = new MemoryStream[pages.Count()];

            for (int i = 0; i < pages.Count(); i++)
            {
                DocumentPage source = pages[i];
                streams[i] = new MemoryStream();

                RenderTargetBitmap renderTarget =
                   new RenderTargetBitmap((int)source.Size.Width,
                                           (int)source.Size.Height,
                                           96, // WPF (Avalon) units are 96dpi based
                                           96,
                                           System.Windows.Media.PixelFormats.Default);

                renderTarget.Render(source.Visual);

                JpegBitmapEncoder encoder = new JpegBitmapEncoder();  // Choose type here ie: JpegBitmapEncoder, etc
                encoder.QualityLevel = 100;
                encoder.Frames.Add(BitmapFrame.Create(renderTarget));

                encoder.Save(streams[i]);

                FileStream file = new FileStream(dirPath + "Page_" + (i+1) + ".jpg", FileMode.CreateNew);
                file.Write(streams[i].GetBuffer(), 0, (int)streams[i].Length);
                file.Close();

                streams[i].Position = 0;
            }
        }
        catch (Exception e1)
        {
            throw e1;
        }
        finally
        {
            if (streams != null)
            {
                foreach (MemoryStream stream in streams)
                {
                    stream.Close();
                    stream.Dispose();
                }
            }
        }
    }




rendertargetbitmap