Recuperare
le dimensioni di un'immagine negli Appunti |
Alcune
applicazioni di fotoritocco come Adobe Photoshop permettono
di creare nuove immagini impostandone automaticamente le dimensioni
in base all'immagine presente negli Appunti.
Come riprodurre tale risultato visto che in Visual Basic non
è ancora stato progettato niente di simile?
Il primo passo da compiere consiste nel determinare il formato
del contenuto degli Appunti.
Se infatti prima di utilizzare l'applicazione abbiamo copiato
un testo, è impossibile determinare le dimensioni della
nuova immagine in base alle dimensioni di tale testo.
A questo scopo si dovrà quindi fare uso del metodo
GetFormat. Le costanti dei formati sono diverse a seconda
del tipo di dato contenuto negli Appunti:
vbCFLink
( = &HBF00)
|
informazioni
relative a una conversazione DDE |
vbCFText
( = 1)
|
testo |
vbCFBitmap
( = 2)
|
bitmap |
vbCFMetafile
( = 3)
|
file
.wmf (i metafile sono file in cui un'immagine viene memorizzata
come insieme di oggetti grafici ad esempio linee, cerchi
e poligoni, anziché pixel in modo da ottenere maggiore
precisione di riproduzione dell'immagine rispetto a quella
ottenuta con le immagini composte da pixel. Esistono due
tipi di metafile: standard di estensione .wmf, ed enhanced
di estensione .emf.) |
vbCFDIB
( = 8)
|
bitmap
indipendente dalla periferica (DIB) |
vbCFPalette
( = 9)
|
tavolozza
di colori |
La
sintassi del metodo GetFiormat è la seguente:
Clipboard.GetFormat(formato) |
dove
formato indica uno delle costanti elencate poco sopra. Siccome
il parametro è obbligatorio ossia non si può
indicare:
si
può andare a tentativi. L'unica costante di formato che
interessa all'applicazione in sviluppo è vbCFBitmap:
indicandola all'interno del metodo GetFormat si otterrà
True se negli Appunti è contenuta un'immagine e False
in tutti gli altri casi:
MsgBox
Clipboard.GetFormat(vbCFBitmap) |
Quindi
il primo blocco dell'applicazione potrebbe essere il seguente:
Private
Sub
Form_Load()
If Clipboard.GetFormat(vbCFBitmap)
= True Then
'...
'...
'...
Else
MsgBox "Formato non supportato"
Exit Sub
End If
End Sub |
Un
altro modo per ottenere lo stesso risultato è con l'ausilio
della funzione IsClipboardFormatAvailable che consente
di verificare il supporto di un maggior numero di formati
(vedere l'Indice per la lista dei formati) ma che, essendo
un API, è soggetta agli inconvenienti della sua categoria
(vedere sempre l'Indice).
La sua sintassi è la seguente:
Declare
Function
IsClipboardFormatAvailable Lib
"user32" (ByVal
wFormat As Long)_ As
Long |
dove
wFormat è una costante di formato. La funzione ritorna
0 nel caso in cui la costante indicata non rappresenti lo
stesso formato dei dati contenuti negli Appunti ed 1 in caso
di successo. Perciò il codice visto poco sopra trova
l'equivalente in quello mostrato qui sotto:
Private
Declare Function
IsClipboardFormatAvailable Lib
"user32" (ByVal
wFormat _ As Long) As
Long
Private Const CF_BITMAP
= 2
Private
Sub Form_Load()
If IsClipboardFormatAvailable(CF_BITMAP)
= 1 Then
'...
'...
'...
Else
MsgBox "Formato non supportato"
Exit Sub
End If
End Sub |
La
scelta tra le due strade è naturalmente lasciata ad
ognuno. In questo articolo però si utilizzerà
la prima.
Il punto centrale della discussione sta nella creazione di
un oggetto che chiameremo Immagine e che rappresenterà
l'immagine virtuale contenuta negli Appunti. Virtuale in quanto
non essendo visibile ne rappresenta soltanto un richiamo.
Dunque nelle dichiarazioni generali:
Adesso
il lavoro è praticamente concluso. Quello che rimane
è associare il contenuto degli Appunti all'oggetto
Immagine:
Set
Immagine = Clipboard.GetData(vbCFBitmap) |
Notare
che la linea di codice sopra utilizza la costante vbCFBitmap
ma è equivalente ad utilizzare CF_BITMAP. vbCFBitmap
è però una funzione interna al linguaggio mentre
CF_BITMAP non lo è e quindi dovrà essere richiamata
nelle dichiarazioni generali.
D'ora in poi si potrà gestire l'oggetto Immagine proprio
come un oggetto Image vero e proprio. Eccone la riprova:
MsgBox
Immagine.Width & " - " & Immagine.Height |
Ora
inserire un controllo PictureBox sul piano ed assegnargli
l'unità di misura Centimeters:
Ripetere
la stessa operazione per la Form:
Per
far notare che si tratta di un'immagine nuova si può
colorare di bianco il controllo PictureBox:
Picture1.BackColor
= vbWhite |
E
finalmente si può adottare la PictureBox in base alle
dimensioni dell'immagine negli Appunti:
Picture1.Width
= Immagine.Width/1000
Picture1.Height = Immagine.Height/1000 |
La
divisione per 1000 riporta la misurazione ai centimetri. Nel
caso di immagini molto piccole, dell'ordine dei 2-3 centimetri
ci possono essere delle variazioni tra la dimensione dell'immagine
originale e quella della PictureBox. In quel caso sarà
sufficiente adottare delle piccole modifiche all'operazione
di divisione.
Se
a questo punto si vorrà inserire l'immagine nella PictureBox
basterà includere nel piano un controllo CommandButton
ed utilizzare il blocco di codice che segue:
Private
Sub
Command1_Click()
Picture1.Picture = Clipboard.GetData(vbCFBitmap)
End Sub |
Il
risultato è quello che segue:
per creare
quest'immagine è stato eseguita la cattura dell'intera
schermata che, essendo molto più estesa della form
del progetto, risulta non completamente visibile.
Si riporta di seguito il codice relativo al progetto completo:
Dim
Immagine As Object
Private Const CF_BITMAP =
2
Private
Sub Command1_Click()
Picture1.Picture = Clipboard.GetData(CF_BITMAP)
End Sub
Private
Sub
Form_Load()
If Clipboard.GetFormat(CF_BITMAP)
= True Then
Picture1.ScaleMode = 7
Form1.ScaleMode = 7
Picture1.BackColor = vbWhite
Set Immagine = Clipboard.GetData(CF_BITMAP)
Picture1.Height = Immagine.Height / 1000
Picture1.Width = Immagine.Width / 1000
Else
MsgBox "Formato non supportato"
Exit Sub
End If
End Sub |
|