+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 4 su 4

[WPF] Calcolo parametro STRIDE per BitmapImage.CopyPixels()

  1. #1
    Sgrubak non è in linea Scribacchino
    Buongiorno a tutti,
    sono alle prese con un programmino che sto sviluppando, all'interno del quale vorrei "spacchettare" un pdf per prendere l'immagine all'interno, ritagliarne una parte e mostrare il ritaglio a video. Ho quindi studiato un po' la documentazione ed ho optato per utilizzare il controllo Image con sorgente una BitmapImage.

    Sono riuscito a produrre questo codice:
            private void OttieniImmagine()
            {
                PdfDocument pdfDoc = new PdfDocument(new PdfReader(Path + _startFileName));
    
                PdfObject obj = pdfDoc.GetPdfObject(9);
                if (obj != null && obj.IsStream())
                {
                    //================================
                    //Valori ottenuti dalla new BitmapImage(new Uri(img))
                    PixelFormat pf = PixelFormats.Bgr32;
                    int width = 2480;
                    int height = 3507;
                    //================================
                    int rawStride = width * pf.BitsPerPixel; // Altri tentativi trovati in rete: [width * pf.BitsPerPixel / 8], [(width * pf.BitsPerPixel + 7) / 8]
                    byte[] b = ((PdfStream)obj).GetBytes();
                    if (b != null)
                    {
                        /* Alternativa funzionante:
                         * string img = string.Format(@"D:\MiaCartella\new{0}.jpeg", _startFileName);
                        using (FileStream file = new FileStream(img, FileMode.Create))
                                            {
                            file.Write(b, 0, b.Length);
                        }
                        BitmapImage t = new BitmapImage(new Uri(img));*/
    
                        //Genera eccezione: System.ArgumentException: 'Dimensioni del buffer insufficienti.'
                        Immagine = BitmapImage.Create(width, height, 300, 300, pf, null, b, rawStride);
    
                        //Dimensioni ritaglio: Width 62px; Height 135px, Left 3375px, Top 1965 px
                    }
                }
                pdfDoc.Close();
            }
    
    Il blocco commentato all'interno della if funziona. Crea il file a partire dal buffer ottenuto e lo mostra correttamente a video (per intero, ma la questione del ritaglio è secondaria). L'ho sfruttato per ottenere i parametri inizializzati ad inizio del metodo.

    Purtroppo con il concetto di "stride" ci ho bisticciato. Ho capito cos'è, ma non riesco a valorizzarlo correttamente. Nonostante vari tentativi, continuo ad ottenere l'eccezione System.ArgumentException: 'Dimensioni del buffer insufficienti.'. Magari la fonte che ho trovato non è precisa, ma ne dubito perché anche altri post/discussioni nei forum, riportano sempre la stessa definizione.

    Qualcuno mi sa dare una dritta su come venirne fuori? Mi piacerebbe non scrivere/cancellare l'immagine su disco ma trattare direttamente l'array, visto che ho parecchi file da analizzare... (E comunque lo stride mi servirebbe per il BitmapImage.CopyPixel per andare a prendere solo la porzione che m'interessa)

    Grazie in anticipo!

  2. #2
    L'avatar di _alka_
    _alka_ non è in linea Very Important Person
    Siamo sicuri che quel parametro sia strettamente necessario e che non vi siano automatismi da sfruttare nella libreria per poter estrarre una immagine in modo più comodo?

    In giro mi pare di aver trovato esempi più semplici che fanno qualcosa del genere... hai fatto qualche ricerca in proposito?
    ℹ️ Leggi di più su _alka_ ...

  3. #3
    Sgrubak non è in linea Scribacchino
    Ciao Alka,
    Quote Originariamente inviato da _alka_ Visualizza il messaggio
    In giro mi pare di aver trovato esempi più semplici che fanno qualcosa del genere... hai fatto qualche ricerca in proposito?
    Si avevo visto qualcosa, ma non son riuscito a trovare molto per iText7 combinato con WPF. C'è qualcosa per WinForm, ma sfrutta sempre la classe System.Drawing.Image e non il controllo System.Windows.Controls.Image.

    Ad ottenere il buffer son riuscito, ma non riesco ad arrivare a creare un'oggetto per valorizzare la proprietà Source.

    Non volevo creare le immagini scrivendo il file JPEG perché devo analizzare parecchi PDF (700/800 circa) e dell'immagine contenuta me ne interessa solo un pezzettino. Se riuscissi a creare l'oggetto, poi lo ritaglio e lo mostro nella ListView dell'UI. In un secondo momento provo a dare in pasto il ritaglio ad un OCR e completare l'automatismo lasciando all'utente solo il compito di gestire solo i documenti che daranno errori/eccezioni.

  4. #4
    L'avatar di _alka_
    _alka_ non è in linea Very Important Person
    Quote Originariamente inviato da Sgrubak Visualizza il messaggio
    Si avevo visto qualcosa, ma non son riuscito a trovare molto per iText7 combinato con WPF. C'è qualcosa per WinForm, ma sfrutta sempre la classe System.Drawing.Image e non il controllo System.Windows.Controls.Image.
    Non confondere la classe che consente di gestire una immagine con quella che rappresenta un controllo visuale in grado di visualizzarla.

    Quando hai a che fare con una System.Drawing.Image, hai un oggetto che ti consente di immagazzinare e manipolare una immagine in memoria (leggerla, salvarla, disegnarci sopra, convertirla in altri formati, ecc.) quindi tale oggetto puoi assegnarlo successivamente a qualsiasi controllo (a prescindere alla libreria, che sia WinForms o WPF) per la visualizzazione a video.
    ℹ️ Leggi di più su _alka_ ...

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Query WHERE IN con parametro
    Da jimbosan_ryuseiken nel forum Microsoft Access
    Risposte: 1
    Ultimo Post: 21-01-2016, 16:19
  2. query con parametro
    Da Imperiali nel forum Microsoft Word
    Risposte: 3
    Ultimo Post: 28-07-2014, 07:19
  3. parametro query da vba
    Da mobile75 nel forum Microsoft Access
    Risposte: 13
    Ultimo Post: 29-04-2013, 07:50
  4. Parametro vettore
    Da bornslippy nel forum Visual Basic 6
    Risposte: 4
    Ultimo Post: 04-03-2005, 17:42
  5. [VB.NET] Inviare un parametro al Report..
    Da web_race nel forum Visual Basic 6
    Risposte: 4
    Ultimo Post: 13-02-2004, 11:36