private byte[] getImage(Guid fotografiaId, IdrataTarget quale) { byte[] bytes = null; using (new UnitOfWorkScope()) { var srv = LumenApplication.Instance.getServizioAvviato <IEntityRepositorySrv <Fotografia> >(); Fotografia fotografia = srv.getById(fotografiaId); string nomeFileImg; // Qui faccio una piccola miglioria: Se l'immagine risultante ha delle correzioni non ancora applicate, le applico adesso. if (quale == IdrataTarget.Risultante) { nomeFileImg = AiutanteFoto.idrataImmagineDaStampare(fotografia); } else { nomeFileImg = AiutanteFoto.idrataImmaginiFoto(fotografia, quale); } bytes = File.ReadAllBytes(nomeFileImg); AiutanteFoto.disposeImmagini(fotografia, IdrataTarget.Tutte); } return(bytes); }
/// <summary> /// Quando lavoro con una singola foto, se vado sullo schermo del pubblico, /// devo fare vedere la foto più bella che ho (cioè quella grande) /// Il problema è che la foto grande, potrebbe ancora non essere stata calcolata /// </summary> /// <param name="fotografia"></param> /// public void eseguiSnapshotSuFinestraPubblica(Fotografia fotografia, bool forzaAperturaWin) { // Se la finestra è chiusa e il flag non mi forza l'apertura non faccio niente if (!forzaAperturaWin && _snapshotPubblicoWindow == null) { return; } FotoDisposeUtils.Instance().DisposeFotografia(fotografia); IdrataTarget quale = AiutanteFoto.qualeImmagineDaStampare(fotografia); AiutanteFoto.idrataImmagineDaStampare(fotografia); IImmagine immagine = AiutanteFoto.getImmagineFoto(fotografia, quale); forseApriSnapshotPubblicoWindow(); snapshotPubblicoViewModel.snapshotImageSource = ((ImmagineWic)immagine).bitmapSource; }
private void viewFotoFullScreen() { // Qui devo capire quale foto verrà idratata IdrataTarget quale = AiutanteFoto.qualeImmagineDaStampare(singolaFotoTarget); // Qui idrato AiutanteFoto.idrataImmagineDaStampare(singolaFotoTarget); // Qui ricavo la foto IImmagine img = AiutanteFoto.getImmagineFoto(singolaFotoTarget, quale); var imageSource = ((ImmagineWic)img).bitmapSource as ImageSource; // Qui passo la foto al viewmodel che la deve visualizzare PanAndZoomViewModel panZommViewModel = new PanAndZoomViewModel(imageSource); // TODO anti-pattern : aprire finestre nel WiewModel. // usare openPopupDialogRequest come già fatto per associazione faccia fotografo PanAndZoomWindow w = new Digiphoto.Lumen.UI.PanAndZoom.PanAndZoomWindow(); w.DataContext = panZommViewModel; w.ShowDialog(); }
/// <summary> /// /// </summary> /// <param name="values">Un array di oggetti cosi: composto:</br> /// indice = 0 : un oggetto Fotografia /// indice = 1 : un viewModel (o una qualsiasi classe) che implementi l'interfaccia IContenitoreGriglia /// </param> /// <param name="targetType"></param> /// <param name="parameter"></param> /// <param name="culture"></param> /// <returns>una ImageSource</returns> public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { ImageSource imageSource = null; try { Fotografia fotografia = (Fotografia)values[0]; IContenitoreGriglia vmContenitoreGriglia = (IContenitoreGriglia)values[1]; IdrataTarget quale; // Se sto visualizzando una sola foto, oppure due affiancate su di una riga .... scelgo alta qualita if (vmContenitoreGriglia != null && richiedeAltaQualita(vmContenitoreGriglia.numRighe, vmContenitoreGriglia.numColonne)) { // ALTA QUALITA (più lento) quale = AiutanteFoto.qualeImmagineDaStampare(fotografia); AiutanteFoto.idrataImmagineDaStampare(fotografia); } else { // BASSA QUALITA (più veloce) quale = IdrataTarget.Provino; } IImmagine immagine = AiutanteFoto.getImmagineFoto(fotografia, quale); if (immagine != null) { imageSource = ((ImmagineWic)immagine).bitmapSource as ImageSource; } } catch (Exception ee) { _giornale.Error("estrazione immagine fallita", ee); // Alcune immagini possono essere rovinate o mancanti. Devo proseguire. imageSource = null; } return(imageSource); }
/** * Attenzione: * questo metodo deve ritornare l'esito della stampa, quindi non deve essere asincrono. * Deve essere sicronizzato */ public EsitoStampa esegui(LavoroDiStampa lavoroDiStampa) { LavoroDiStampaFoto _lavoroDiStampa = lavoroDiStampa as LavoroDiStampaFoto; _giornale.Debug("Sto per avviare il lavoro di stampa: " + lavoroDiStampa.ToString()); _conta++; try { string nomeFileFoto = AiutanteFoto.idrataImmagineDaStampare(_lavoroDiStampa.fotografia); // Ricavo l'immagine da stampare IImmagine immagine = _lavoroDiStampa.fotografia.imgRisultante != null ? _lavoroDiStampa.fotografia.imgRisultante : _lavoroDiStampa.fotografia.imgOrig; // Gestisco una eccezione specifica, in questo modo ho un messaggio chiaro di cosa è andato storto. if (immagine == null) { throw new FileNotFoundException("fotografia = " + _lavoroDiStampa.fotografia, _lavoroDiStampa.fotografia.nomeFile); } // Devo clonare l'immagine perché negli atri thread potrebbero eseguire delle dispose che me la svuotano using (IImmagine immagineDaStampare = (IImmagine)immagine.Clone()) { // TODO BLUCA provo a duplicare l'immagine per evitare l'errore che è di proprietà del thread chiamante. // BitmapSource bmp = new WriteableBitmap( ((ImmagineWic)immagineDaStampare).bitmapSource ); // bmp.Freeze(); BitmapSource bmp = ((ImmagineWic)immagineDaStampare).bitmapSource; var match = Regex.Match(lavoroDiStampa.param.nomeStampante, @"(?<machine>\\\\.*?)\\(?<queue>.*)"); PrintServer ps1 = null; if (match.Success) { // Come print-server uso il server di rete ps1 = new PrintServer(match.Groups["machine"].Value); } else { // Come print-server uso me stesso ps1 = new PrintServer(); } using ( ps1 ) { PrintQueue coda = null; if (match.Success) { coda = ps1.GetPrintQueue(match.Groups["queue"].Value); } else { coda = ps1.GetPrintQueue(lavoroDiStampa.param.nomeStampante); } // Ricavo la coda di stampa (cioè la stampante) e le sue capacità. using ( coda ) { PrintCapabilities capabilities = null; try { capabilities = coda.GetPrintCapabilities(); } catch (Exception) { // Le stampanti shinko non supportano } // Imposto la stampante (così che mi carica le impostazioni) PrintDialog dialog = new PrintDialog(); dialog.PrintQueue = coda; Size areaStampabile = new Size(dialog.PrintableAreaWidth, dialog.PrintableAreaHeight); // Imposto qualche attributo della stampa bool piuRealistaDelRe = false; if (piuRealistaDelRe) // Meglio non essere più realisti del re. { dialog.PrintTicket.OutputQuality = OutputQuality.Photographic; dialog.PrintTicket.PhotoPrintingIntent = PhotoPrintingIntent.PhotoBest; } // Compongo il titolo della stampa che comparirà nella descrizione della riga nello spooler di windows StringBuilder titolo = new StringBuilder(); titolo.AppendFormat("foto N.{0} Oper={1} gg={2}", _lavoroDiStampa.fotografia.etichetta, _lavoroDiStampa.fotografia.fotografo.iniziali, String.Format("{0:dd-MMM}", _lavoroDiStampa.fotografia.dataOraAcquisizione)); #if DEBUG titolo.Append(" #"); titolo.Append(DateTime.Now.ToString("mmssss")); // Uso un numero univoco per evitare doppioni per il doPdf altrimenti mi chiede sempre di sovrascrivere #endif // Eventuale rotazione dell'orientamento dell'area di stampa // Devo decidere in anticipo se la stampante va girata. Dopo che ho chiamato Print non si può più fare !!! bool _ruotareStampante = false; if (_lavoroDiStampa.param.autoRuota) { if (!ProiettoreArea.isStessoOrientamento(areaStampabile, immagineDaStampare)) { _ruotareStampante = true; } } if (_ruotareStampante) { if (capabilities != null && capabilities.PageOrientationCapability.Contains(PageOrientation.Landscape) && capabilities.PageOrientationCapability.Contains(PageOrientation.Portrait)) { // tutto ok dialog.PrintTicket.PageOrientation = (dialog.PrintTicket.PageOrientation == PageOrientation.Landscape ? PageOrientation.Portrait : PageOrientation.Landscape); } else { _giornale.Debug("La stampante " + lavoroDiStampa.param.nomeStampante + " non accetta cambio orientamento landscape/portrait"); } // Quando giro la stampante, non mi si girano anche le dimensioni. Ci penso da solo. areaStampabile = ProiettoreArea.ruota(areaStampabile); } // // ----- gestisco il numero di copie // int cicliStampa = 1; if (lavoroDiStampa.param.numCopie > 1) { // Se la stampante gestisce le copie multiple, faccio un invio solo. if (capabilities != null && capabilities.MaxCopyCount >= lavoroDiStampa.param.numCopie) { dialog.PrintTicket.CopyCount = lavoroDiStampa.param.numCopie; } else { cicliStampa = lavoroDiStampa.param.numCopie; } } // // ----- Preparo la realizzazione grafica da mandare in output // // Ora creo il documento che andrò a stampare. // L'uso di un FixedDocument, mi permetterà di interagire con misure, dimensioni e margini FixedDocument document = new FixedDocument(); document.DocumentPaginator.PageSize = new Size(dialog.PrintableAreaWidth, dialog.PrintableAreaHeight); // Creo una pagina della grandezza massima FixedPage page1 = new FixedPage(); page1.Width = document.DocumentPaginator.PageSize.Width; page1.Height = document.DocumentPaginator.PageSize.Height; page1.VerticalAlignment = VerticalAlignment.Center; page1.HorizontalAlignment = HorizontalAlignment.Center; // Per fare in modo che l'immagine venga centrata bene automaticamente, e non venga tagliata solo da una parte ma nel centro, // non devo mettere le dimensioni al componente Image, ma devo creare // una Grid più esterna con le dimensioni precise. Grid grid = new Grid(); grid.Height = page1.Height; grid.Width = page1.Width; // Creo una immagine che contiene la bitmap da stampare Image image = new Image(); // image.BeginInit(); image.VerticalAlignment = VerticalAlignment.Center; image.HorizontalAlignment = HorizontalAlignment.Center; // BitmapSource clone = bmp.Clone(); // clone.Freeze(); image.Source = bmp; if (_lavoroDiStampa.param.autoZoomNoBordiBianchi) { image.Stretch = Stretch.UniformToFill; } else { image.Stretch = Stretch.Uniform; } image.StretchDirection = StretchDirection.Both; // image.EndInit(); grid.Children.Add(image); page1.Children.Add(grid); // eventualiStampigli(page1, _lavoroDiStampa); // add the page to the document PageContent page1Content = new PageContent(); page1Content.Child = page1; document.Pages.Add(page1Content); // // ----- STAMPA per davvero // for (int ciclo = 0; ciclo < cicliStampa; ciclo++) { dialog.PrintDocument(document.DocumentPaginator, titolo.ToString()); _esito = EsitoStampa.Ok; } _giornale.Debug("Stampa completata"); // Per cercare di liberare memoria più possibile svuoto le pagine forzatamente a mano. // Pare che il GC non riesce a pulire. foreach (var fixedPage in document.Pages.Select(pageContent => pageContent.Child)) { fixedPage.Children.Clear(); } } // using printqueue } // using printserver } // using iimagine } catch (Exception ee) { _esito = EsitoStampa.Errore; _giornale.Error("Stampa fallita", ee); } finally { // Rilascio le immagini idratate altrimenti in loop vado in outOfMemory AiutanteFoto.disposeImmagini(_lavoroDiStampa.fotografia, IdrataTarget.Risultante); AiutanteFoto.disposeImmagini(_lavoroDiStampa.fotografia, IdrataTarget.Originale); CoreUtil.abraCadabra(); // :-) } _giornale.Info("Completato lavoro di stampa. Esito = " + _esito + " lavoro = " + lavoroDiStampa.ToString()); return(_esito); }
private void aggiungiImmagineAlCanvas(Canvas canvas, Fotografia foto, int riga, int col) { try { // Ricavo l'immagine da stampare IImmagine immagine; bool usoGrande = false; if (usoGrande) { AiutanteFoto.idrataImmagineDaStampare(foto); immagine = AiutanteFoto.idrataImmagineGrande(foto); immaginiPaginaPrecedente.Add(immagine); } else { AiutanteFoto.idrataImmaginiFoto(foto, IdrataTarget.Provino); immagine = foto.imgProvino; } Image img = new Image(); img.Stretch = Stretch.UniformToFill; img.StretchDirection = StretchDirection.Both; { // calcolo posizione left int tc = lavoroDiStampaTessera.paramStampaTessera.numColonne; double tuc = sizeLatoW * tc; double spaziow = (larghezzaEffettiva - tuc) / (tc + 1); double left = (spaziow * col) + (sizeLatoW * (col - 1)); img.SetValue(Canvas.LeftProperty, left); } { // calcolo posizione top int tr = lavoroDiStampaTessera.paramStampaTessera.numRighe; double tur = sizeLatoH * tr; double spazioh = (altezzaEffettiva - tur) / (tr + 1); double top = (spazioh * riga) + (sizeLatoH * (riga - 1)); img.SetValue(Canvas.TopProperty, top); } // Queste due dimensioni invece sono fisse img.Width = sizeLatoW; img.Height = sizeLatoH; img.HorizontalAlignment = HorizontalAlignment.Center; img.VerticalAlignment = VerticalAlignment.Center; if (immagine != null) { img.RenderSize = new Size(img.Width, img.Height); // TODO tento di tenere bassa la memoria img.BeginInit(); BitmapSource bs = ((ImmagineWic)immagine).bitmapSource; img.Source = bs; img.EndInit(); } canvas.Children.Add(img); } catch (Exception ee) { // Non rilancio l'eccezione perché voglio continuare a stampare _giornale.Error("Impossibile caricare immagime della foto: " + foto, ee); } }
private void aggiungiImmagineAlCanvas(Canvas canvas, Fotografia foto, double x, double y) { try { // Ricavo l'immagine da stampare IImmagine provino; if (usoGrande) { AiutanteFoto.idrataImmagineDaStampare(foto); provino = AiutanteFoto.idrataImmagineGrande(foto); if (Configurazione.UserConfigLumen.tecSogliaStampaProvini == -3) { IGestoreImmagineSrv g = LumenApplication.Instance.getServizioAvviato <IGestoreImmagineSrv>(); IImmagine provino2 = g.creaProvino(provino, 1000); provino = (IImmagine)provino2.Clone(); ((ImmagineWic)provino).bitmapSource.Freeze(); AiutanteFoto.disposeImmagini(foto, IdrataTarget.Originale); AiutanteFoto.disposeImmagini(foto, IdrataTarget.Risultante); } immaginiPaginaPrecedente.Add(provino); } else { AiutanteFoto.idrataImmaginiFoto(foto, IdrataTarget.Provino); provino = foto.imgProvino; } Image img = new Image(); img.Stretch = Stretch.Uniform; img.StretchDirection = StretchDirection.Both; img.SetValue(Canvas.TopProperty, (Double)(sizeLatoH * (y - 1)) + testataH); img.SetValue(Canvas.LeftProperty, (Double)(sizeLatoW * (x - 1) + margin / 2)); img.Width = sizeLatoW - margin; img.Height = sizeLatoH - margin; img.HorizontalAlignment = HorizontalAlignment.Center; img.VerticalAlignment = VerticalAlignment.Center; if (provino != null) { img.RenderSize = new Size(img.Width, img.Height); // TODO tento di tenere bassa la memoria img.BeginInit(); BitmapSource bs = ((ImmagineWic)provino).bitmapSource; img.Source = bs; img.EndInit(); } canvas.Children.Add(img); } catch (Exception ee) { // Non rilancio l'eccezione perché voglio continuare a stampare _giornale.Error("Impossibile caricare immagime della foto: " + foto, ee); } eventualiStampigli(canvas, x, y, foto); }