Blog di LucaB

audio, video, disco

Cambiare dinamicamente l'immagine di intestazione del blog

Una delle prime cose che ho fatto su questo blog è stato provare i diversi skin. La gestione del look del blog dà anche la possibilità di sovrascrivere il css, il che ad esempio è utile se si vuole cambiare un'immagine impostata come background di un elemento div.

E se volessi cambiare l'immagine visualizzata come background dell'intestazione scegliendola in maniera casuale, oppure a seconda dell'ora in cui si visualizza la pagina?

Ho pensato, ad esempio, di preparare 5 immagini diverse: 5 fotoritocchi dello stesso panorama (eseguiti malamente da me, ma appena si libera Nico[1] mi faccio aiutare) che, cambiandone la luce, danno le versioni "mattino.jpg", "giorno.jpg", "pomeriggio.jpg", "sera.jpg" e "notte.jpg", tra cui scegliere quale visualizzare a seconda dell'ora.

mattino giorno pomeriggio sera notte

Avendo a disposizione un server web, ho scritto una piccola applicazione che utilizza un HttpHandler.

Basta creare un progetto web con VS e, all'interno di questo, aggiungere un un HttpHandler, come illustrato in figura (ho usato VS Web Developer 2005 Express Edition):

Screenshot di VS Web Developer 2005 Express Edition

A questo punto dobbiamo scrivere il codice. Stiamo scrivendo un HttpHandler, ossia implementando l'interfaccia IHttpHandler, per cui dovremo specificare il metodo ProcessRequest e la proprietà IsReusable.

IsReusable può essere impostata a False o a True: come dice la parola stessa, indica se il nostro oggetto handler può essere riutilizzato (True) o se ogni volta se ne deve creare una nuova istanza (False). Poiché l'handler non andrà a modificare nulla, ma solo a leggere dati, il codice può essere considerato threadsafe, per cui la impostiamo a True.

ProcessRequest rappresenta cosa deve fare praticamente l'handler quando riceve una richiesta, cioè nel nostro caso deve inviare al client l'immagine opportuna in base all'ora del sistema. Ad esempio il codice in VB.NET potrebbe essere questo (non tenendo conto di stagioni, ora legale, ecc. Wink)

Dim nomiFileImmagine() As String = _ 
{"mattino", "giorno", "pomeriggio", "sera", "notte"} Dim n, ora As Integer ora = DateTime.Now.Hour Select Case ora Case 22 To 24, 0 To 6 n = 4 Case 7 To 9 n = 0 Case 17 To 19 n = 2 Case 20 To 21 n = 3 Case Else n = 1 End Select

Adesso basta inviare al client il file binario che rappresenta l'immagine jpg scelta utilizzando Response.WriteFile riferito all'HttpContext (argomento della ProcessRequest).

Alla fine il codice completo è il seguente:

<%@ WebHandler Language="VB" Class="ImmagineOraria" %>

Imports System
Imports System.Web

Public Class ImmagineOraria : Implements IHttpHandler
    
    Const DIRIMMAGINI = "directoryimmagini/headerblog/"
    
    Public Sub ProcessRequest(ByVal context As HttpContext) _
Implements IHttpHandler.ProcessRequest Dim nomiFileImmagine() As String = _
{"mattino", "giorno", "pomeriggio", "sera", "notte"} Dim n, ora As Integer ora = DateTime.Now.Hour Select Case ora Case 22 To 24, 0 To 6 n = 4 Case 7 To 9 n = 0 Case 17 To 19 n = 2 Case 20 To 21 n = 3 Case Else n = 1 End Select Dim response As Web.HttpResponse = context.Response response.ContentType = "image/jpeg" response.Cache.SetCacheability(HttpCacheability.Public) response.BufferOutput = False response.WriteFile(context.Server.MapPath(DIRIMMAGINI & _
nomiFileImmagine(n) & ".jpg")) response.End() End Sub Public ReadOnly Property IsReusable() As Boolean _
Implements IHttpHandler.IsReusable Get Return True End Get End Property End Class

Nella dashboard del blog basta fare un override del css impostando (per il div di intestazione):

background-image: url(http://miowebserver/ImmagineOraria.ashx);

ed il gioco è fatto.

Per provare l'handler localmente prima di farne l'upload sul server, basta aggiungere al progetto una semplice pagina HTML che contenga nel body:

<img src="ImmagineOraria.ashx" alt="immagine"/>

Un'altra possibilità potrebbe essere quella di far scegliere l'immagine a caso tra quelle presenti all'interno di una cartella sul server. In questo caso il codice in VB potrebbe essere:

<%@ WebHandler Language="VB" Class="ImmagineCasuale" %>

Imports System
Imports System.Web

Public Class ImmagineCasuale : Implements IHttpHandler
    
    Const DIRIMMAGINI = "directoryimmagini/headercasuale"
    
    Public Sub ProcessRequest(ByVal context As HttpContext) _
Implements IHttpHandler.ProcessRequest Dim nomiFileImmagine() As String = _
System.IO.Directory.GetFiles(context.Server.MapPath(DIRIMMAGINI), "*.jpg") If nomiFileImmagine.Length > 0 Then Dim n As Integer Dim vMax As Integer vMax = nomiFileImmagine.GetUpperBound(0) Randomize() n = CInt(Int((vMax + 1) * Rnd())) Dim response As Web.HttpResponse = context.Response response.ContentType = "image/jpeg" response.Cache.SetCacheability(HttpCacheability.Public) response.BufferOutput = False response.WriteFile(nomiFileImmagine(n)) response.End() End If End Sub Public ReadOnly Property IsReusable() As Boolean _
Implements IHttpHandler.IsReusable Get Return True End Get End Property End Class


[1]Il mio amico Nico lavora come grafico nella mia stessa ditta e con Photoshop è in grado di realizzare in 2 minuti quello che riesco a fare in 1 ora, ma con risultati decisamente migliori. Del resto la tecnologia avanza, ma (come disse Vito a proposito di WPF nel corso di un evento) la grafica creata dagli sviluppatori fa sempre abbastanza schifo.

View blog reactions

Comments

MADIL's Blog said:

Tempo fa avevo realizzato un HTTP Handler , per cambiare dinamicamente l’header del mio blog per maggiori

# November 22, 2012 11:23 AM