Animali da… fotografia: Il Gufo

Talvolta alcuni animali si affacciano sulla scena mentre sto scattando qualche fotografia a mio figlio, invadendo dispettosamente non solo la pellicola ma anche la sua immaginazione. Ogni volta infatti, grazie anche all’aiuto della magia Photoshoppiana riescono a burlarsi dei nostri scarsi riflessi causando l’inesorabile lamentela dei soggetti, che pur presenti sulla scena, non sono riusciti a vederli.

Ecco alcuni esempi…

Sulle giostre con il gufo…
+
Pubblicato in Photoshop clips | Contrassegnato , , , , , | Lascia un commento

Animali da… fotografia: La Tartaruga

Talvolta alcuni animali si affacciano sulla scena mentre sto scattando qualche fotografia a mio figlio, invadendo dispettosamente non solo la pellicola ma anche la sua immaginazione. Ogni volta infatti, grazie anche all’aiuto della magia Photoshoppiana riescono a burlarsi dei nostri scarsi riflessi causando l’inesorabile lamentela dei soggetti, che pur presenti sulla scena, non sono riusciti a vederli.

Ecco alcuni esempi…

 

Al mare con la tartaruga…
+
Pubblicato in Photoshop clips | Contrassegnato , , , , , , , | Lascia un commento

Animali da… fotografia: Il Serpente

Talvolta alcuni animali si affacciano sulla scena mentre sto scattando qualche fotografia a mio figlio, invadendo dispettosamente non solo la pellicola ma anche la sua immaginazione. Ogni volta infatti, grazie anche all’aiuto della magia Photoshoppiana riescono a burlarsi dei nostri scarsi riflessi causando l’inesorabile lamentela dei soggetti, che pur presenti sulla scena, non sono riusciti a vederli.

Ecco alcuni esempi…

Carnevale col serpente…
+
Pubblicato in Photoshop clips | Contrassegnato , , , , , , | Lascia un commento

Thumbnail “al volo” con .Net

Scarica il file thumbnail.aspx

 

In tanti anni di programmazione ho messo da parte tanti tips e tanti tricks che potrebbero venire utili a chi si avvicina per la prima volta al mondo della programmazione, specialmente in c#.
Non so se riuscirò ad avere il tempo di mettere on line il materiale che in questi anni ho sviluppato, ma piano piano, spero di riuscire a pubblicare abbastanza articoli da poter essere utile a qualcuno.

Spesso capita, per chi lavora con asp.net di dover fare i conti con immagini caricate dall’utente tramite un backoffice sviluppato “ad hoc”. Immaginiamo ad esempio un sito di e-commerce, l’utente avrà a disposizione un’area protetta dove amministrare il sito, inserire nuovi prodotti, informazioni e immagini;
oppure un sito di un’agenzia immobiliare, l’agenzia dovrà poter inserire un immobile, le relative informazioni e anche un set di immagini per rendere l’inserzione più appetibile per chi cerca casa.
Generalmente l’utente che usa il backoffice non ha specifiche competenze informatiche e quasi sempre non capisce la differenza tra caricare un’immagine da 3Mb rispetto ad una di 300Kb. In più, le attuali macchine fotografiche digitali scattano fotografia con risoluzioni ormai altissime, pesanti ed inutilmente grandi in contesti web, che porteranno sicuramente l’utente amministratore del sito, a caricare immagini inutilmente grandi e che rischiano di rallentare in maniera notevole il caricamente delle pagine anche con connessioni a banda larga.

Il programmatore che sviluppa il backoffice del sito, al fine di evitare suicidi di massa nell’attesa del caricamento delle pagine, dovrà cercare di limitare il più possibile questo problema scegliendo tra almeno 2 soluzioni architetturali: 

  1. Ridurre le immagini “on the fly” quando queste vengono visualizzate nel parte di presentation
  2. Ridimesionare le immagini all’atto del caricamento sul server

Inutile dire che la seconda ipotesi permette di risparmiare spazio su disco ma è un’operazione irreversibile. Una volta che l’immagine è stata ridimensionata non sarà più possibile visualizzarla con risoluzioni superiori se non con una grave perdita di qualità.
Oggi spiegherò la soluzione 1, come riuscire a ridurre le immagini “al volo” senza perdere la qualità e credetemi, nulla di più semplice.
Non cito nemmeno la possibilità di ridimensionare l’immagine con gli attributi del tag img html poichè, come ben sapete, quest’operazione non riduce la quantità di dati che il client/browser deve scaricare ma ridimensiona l’immagine solo dopo averla scaricata e con scarsissimi risultati.
 

Innanzitutto un concetto fondamentale:
quando in il browser interpreta il tag html <img> sa che riceverà dal webserver uno stream di byte che lui stesso dovrà interpretare e decodificare in base al “content type” che sarà inviato sempre dal webserver. Il file dunque che noi specifichiamo all’interno del tag <img>, verrà inviato dal webserver come uno stream di bytes al browser. Se si tratta di un file jpg, il webserver lo leggerà ed invierà il contenuto al browser con il content type “image/jpeg”, se si trattasse invece di un file gif, il content type inviato dal webserver sarebbe “image/gif”.
Detto questo, nulla ci vieta dunque di mettere al posto del nome del file da visualizzare un link di altra natura, che punti ad una pagina aspx, che poi ritorni a sua volta uno stream di bytes con gli opportuni content types.
Voglio poter inserire un tag simile:

<img src=”thumbnail.aspx?FN=/public/images/test.jpg&amp;MW=800&amp;MH=600“/>


Dunque, vediamo di capire come è composta la pagina aspx che dobbiamo creare e i concetti che ci stanno dietro… 

Esempio : 

Gundam ridimensionato a 150px Gundam ridimensionato a 150px in  altezza (guarda le proprietà dell’immagine per vederil link completo) 

Gundam ridimesionato a 300px Gundam ridimensionato a 300px in  altezza (guarda le proprietà dell’immagine per vederil link completo) 

Gundam immagine originale. 

  

La nostra pagina aspx che andremo a creare accetterà 3 parametri in ingresso: 

  1. FN = Path del file immagine da ridimensionare
  2. MW = Larghezza in pixel dell’immagine desiderata
  3. MH = Altezza in pixel dell’immagine desiderata 

Il codice completo ed utilizzabile è allegato all’articolo. Questo codice che ho scritto implementa in più anche la possibilità di applicare sopra l’immagine un logo precedentemente creato per “etichettare” per così dire, l’immagine. Esempi del risultato li potete trovare in tutte le immagine del seguente sito: http://www.ilcercacasa.org 

Passiamo a commentare il codice: 


 

private Image getThumbnailImage(Image src, Int32 width, Int32 height){
    return src.GetThumbnailImage(width, height, null, IntPtr.Zero);	//IntPtr.Zero
}

Ecco, la funzione descritta sopra GetThumbnailImage è una funzione parallela a quella scritta da me. Infatti non tutti sanno che windows memorizza una piccola miniatura di tutte le immagine che elabora all’interno di un database contenente appunto tutte le miniature che man mano vengono create. Questa funzione non fa altro che estrapolare dal database la miniatura dell’immagine richiesta (se non esiste la crea sul momento). Questa funzione però ha due grossi limiti. Il primo riguarda le dimensioni dell’immagine desiderata: la thumbnail (miniatura) che il sistema genera con questo metodo può essere al massimo di 120 px w/h, questo significa che se chiamo questa funzione passandole come parametri di ridimensionamento dei valori che superano i 120px, il sistema prima ridimensionerà l’immagine al valore massimo 120px e poi la ridimensionerà nuovamente al valore richiesto (es 400px). Il risultato è pessimo con una notevole perdita di qualità, è come se allargassimo digitalmente a 400px un’immagine di 120px. Il secondo limite è un bug della funzione: talvolta e non ho ancora capito perchè, la funzione all’interno delle GDI che viene chiamata da GetThumbnailImage ritorna un OutOfMemory facendo esplodere la chiamata. 

  


 

//Controllo se l'iimagine deve essere ridimensionata...
if(oldImage.Width > lWidth || oldImage.Height > lHeight) {
    xfactor = (1.0 * oldImage.Width / lWidth);
    yfactor = (1.0 * oldImage.Height / lHeight);

    if(xfactor >= yfactor) {
        factor = xfactor;
    } else {
        factor = yfactor;
    }

    //Adesso calcolo le dimensioni in base al fattore...
    lWidth = Convert.ToInt32(oldImage.Width / factor);
    lHeight = Convert.ToInt32(oldImage.Height / factor);

  

In questa parte del codice recuperiamo il fattore di riduzione che dobbiamo applicare alle dimensioni dell’immagine per poterla ridimesnionare proporzionalmente. Inoltre controlliamo anche se l’immagine deve essere ridimensionata, infatti l’utente potrebbe aver inserito un’immagine talmente piccola da non richiedere il ridimensionamento. 

  


 

// Bug di GetThumbnailImage, se ritorno un OutOfMemory, è necessario rieseguirla.
try {
    newImage = getThumbnailImage(oldImage, lWidth, lHeight);
} catch (OutOfMemoryException){
    newImage = getThumbnailImage(oldImage, lWidth, lHeight);
}

🙁
Queste sono le parti di codice che un programmatore non vorrebbe mai scrivere !  E’ la classica “sporca”… che però… in questo caso risolve il problema. Prima menzionavo un bug di questa funzione… ecco, richiamando la funzione subito dopo l’OutOfMemory tutto funziona correttamente !!! Incredibile… ma vero !!! 😎  

  


 

//Creo la bitmap nuova che conterrà l'immagine
Bitmap bmp = new Bitmap(lWidth, lHeight);
bmp.SetResolution(oldImage.HorizontalResolution, oldImage.VerticalResolution);

//Mi serve l'oggetto Graphics
Graphics grFx = Graphics.FromImage(bmp);

//Impostazioni globali...
grFx.CompositingQuality = CompositingQuality.HighQuality;
grFx.CompositingMode = CompositingMode.SourceOver;
grFx.InterpolationMode = InterpolationMode.HighQualityBicubic;
grFx.PageUnit = GraphicsUnit.Pixel;
grFx.SmoothingMode = SmoothingMode.HighQuality;

//Ridimensionamento
grFx.DrawImage(oldImage, 0, 0, lWidth, lHeight);
grFx.Dispose();
newImage = bmp;


In questa parte il codice si spiega da solo, creo un oggetto bitmap delle dimensioni desiderate, da questo genero l’oggetto Graphics che mi permette di manipolare diversi attributi relativamente alla qualità dell’immagine, dopodichè ridimensiono l’immagine originale “appiccicandola” sopra il mio oggetto bitmap.
 

  


 

switch(Path.GetExtension(Server.MapPath(decodedFileName))) {
    case ".jpg":
        Response.ContentType = "image/jpeg";	//jpeg
        newImage.Save(Response.OutputStream, ImageFormat.Jpeg);	//Jpeg
        break;
    case ".jpeg":
        Response.ContentType = "image/jpeg";	//jpeg
        newImage.Save(Response.OutputStream, ImageFormat.Jpeg);	//Jpeg
        break;
    case ".gif":
        Response.ContentType = "image/gif";		//gif
        newImage.Save(Response.OutputStream, ImageFormat.Gif);	//Gif
        break;
    case ".png":
        Response.ContentType = "image/png";		//Png
        newImage.Save(Response.OutputStream, ImageFormat.Png);	//Png
        break;
    case ".bmp":
        Response.ContentType = "image/bmp";		//Bmp
        newImage.Save(Response.OutputStream, ImageFormat.Bmp);	//Bmp
        break;
    default:
        Response.ContentType = "image/*";	//else
        newImage.Save(Response.OutputStream, ImageFormat.MemoryBmp);	//else / jpeg
        break;
}

Questa parte invece consente di ordinare al browser come deve interpretare lo stream di bytes che gli verrà passato. Se si tratta di una jpeg, il content type sarà come già detto in precedenza: “image/jpeg”, se è una gif sarà “image/gif” e così via.
  


 

switch(Path.GetExtension(Server.MapPath(decodedFileName))) {
    case ".jpg":
        Response.ContentType = "image/jpeg";	//jpeg
        newImage.Save(Response.OutputStream, ImageFormat.Jpeg);	//Jpeg
        break;
    case ".jpeg":
        Response.ContentType = "image/jpeg";	//jpeg
        newImage.Save(Response.OutputStream, ImageFormat.Jpeg);	//Jpeg
        break;
    case ".gif":
        Response.ContentType = "image/gif";		//gif
        newImage.Save(Response.OutputStream, ImageFormat.Gif);	//Gif
        break;
    case ".png":
        Response.ContentType = "image/png";		//Png
        newImage.Save(Response.OutputStream, ImageFormat.Png);	//Png
        break;
    case ".bmp":
        Response.ContentType = "image/bmp";		//Bmp
        newImage.Save(Response.OutputStream, ImageFormat.Bmp);	//Bmp
        break;
    default:
        Response.ContentType = "image/*";	//else
        newImage.Save(Response.OutputStream, ImageFormat.MemoryBmp);	//else / jpeg
        break;
}

Questa parte invece consente di ordinare al browser come deve interpretare lo stream di bytes che gli verrà passato. Se si tratta di una jpeg, il content type sarà come già detto in precedenza: “image/jpeg”, se è una gif sarà “image/gif” e così via.
Il metodo newImage.Save() permette di inviare l’immagine sullo stream.

 

Bene, direi che potrebbe essere tutto. per testare la thumbnail.aspx copiatela nel vs sito (ovviamente IIS/Microsoft), e chiamatela !!! Spero di esser stato utile a qualcuno :-). Buon divertimento.  

Pubblicato in .Net | Contrassegnato , , , , , , , , , | 1 commento

Missione Francia

Ciao,
oggi vorrei mostrarvi uno dei miei lavori di fotomontaggio fatto per celebrare goliardicamente un lavoro fatto in Francia.
Si voleva celebrare con un’immagine una missione delicata che alcuni amici e colleghi hanno dovuto affrontare in territorio francese.
Quest’ultima essendo stata caratterizzata da inconvenienti tecnici risolti a distanza, attraverso un immediato sillogismo, ci ha subito portato a ricordare la famosa missione nello spazio che ancor oggi viene ricordata dalla frase:
-Houston… abbiamo un problema !-

Il lavoro ha avuto inizio con la ricerca dell’immagine base, quella sulla quale verranno effettuate le modifiche ma che manterrà il carattere ed il messaggio originale. Dopo una breve ricerca su Google immagini, ecco qui il modello scelto:

Immagine base - Apollo

I colleghi che hanno partecipato alla missione Francia erano effettivamente 3… quale immagine migliore di questa ?
Bene, non mi restava altro da fare che trovare una fotografia di ognuno di loro, possibilmente un primo piano, da poter ritagliare e modificare adeguatamente. Mmmmmm… certo che però essendo la missione di nazionalità “francese”, anche le bandiere sulle tute andavano modificate con una bandiera francese, se devi fare una cosa, falla bene ! 🙂
Grazie allora a facebook, ad altri colleghi e a google, mi sono procurato il materiale necessario:

 (i volti delle persone alle quali non ho potuto chiedere la disponibilità ad essere pubblicate le ho schermate, così come i cognomi sulle tute)

Arcangelo

Francesco

Matteo

... e la bandiera francese !

Non ho potuto pubblicare la sequenza delle modifiche fatte e gli screenshot del programma. Prometto che se dovessi effettuare un altro lavoro di fotomontaggio sarò più dettagliato.

Bene, ecco gli step per raggiungere il risultato di vedere i miei tre amici in partenza per la luna.
Innanzitutto ritagliamo i volti degli amici/colleghi in modo da poterli agevolmente sostituire a quelli della foto originale.
E’ necessario lavorare di precisione, ma per un ritaglio pressochè vicino alla perfezione consiglio un plugin per Photoshop che trovo geniale ed essenziale per questi lavori: FluidMask
Purtroppo il viso di Arcangelo è parzialmente coperto dai capelli della ragazza che lo sta abbracciando per cui è necessario “ricostruire” in parte l’immagine che manca, per fare questo si renderà necessario utilizzare la parte destra della testa in modo speculare
.
Dopo aver ritagliato le immagini è necessario giocare con i livelli, il contrasto, la luminosità, la saturazione, la tonalità e la sfocatura per rendere i ritagli più verosimili possibile rispetto alle condizione di luce dell’immagine originale.

La bandiera si rivela essere più complicata del previsto poichè devo adattarla alle tute cercando il più possibile di ricostruire la forma e gli effetti di luce che simulano le increspature e le pieghe della stoffa. Con lo strumento di “trasformazione libera” si riesce a modificare l’immagine discretamente bene, dopodichè giocando con lo strumento “scherma/brucia”, con i livelli, le ombre e gli strumenti elencati in precedenza si riesce ad ottenere un effetto molto realistico.
Ancora un ritocco però si rende essenziale al fine di rendere i ritratti dei miei colleghi più simili a quelli originali, l’aggiunta di un effetto che renda l’immagine sgranata e disturbata come quella originale.

Al termine delle modifiche elencate, il risultato mi sembra buono ed è il seguente :

Risultato

Pubblicato in Photoshop clips | Contrassegnato , , , , , | Lascia un commento

Un pinguino nel giardino

Può capitare !
Quest’inverno mentre mia moglie camminava nel prato di casa ricoperto di neve insieme a mio figlio, si è aggiunto alla fila un ospite inatteso !
Purtroppo mio figlio non ha fatto in tempo a vederlo poichè il pinguino è stato velocissimo a scappare… ma lo scatto della mia macchina fotografica è stato più veloce !
Ma come può essere così veloce un pinguino… ? mah !!!
 

Pinguino

un pinguino nel giardino

Photoshop ?!?
mmmmmhh… ebbene sì.
Se ne stava beato tra i suoi amici pinguini e di colpo si ritrova in un giardino innevato… 😉
  

pinguino
immagine scaricata dal web

  

Pubblicato in Photoshop clips | Lascia un commento