ImageEn v.0.5 beta

Copyright (c) 1998 Fabrizio Di Vittorio

fdivitto@caerenet.it
fdivitto@usa.net
Home page: http://members.tripod.com/~fdivitto
Tel. 0347/6265077 - 06/9948218 (Italy)
Via Lisbona 16 - 00055 Ladispoli (Roma) - Italy


Componente per la visualizzazione ed il trattamento di immagini grafiche a colori.

Attenzione: questo componente è in fase beta, potrebbe quindi contenere degli errori od imperfezioni. Prego chi fosse interessato di inviarmi suggerimenti ed eventuali bug rilevati.Sono disponibile (via EMAIL) per ogni chiarimento.

Installazione:
Dal menù Component attivare "Install Component", da quì premere Browse e selezionare il file "ImageEn.dcu".

Note:
Il preview è contenuto nel file form "previews.dfm" (versione inglese). Per la versione italiana usare "previews.it" (rinominare quindi da previews.it a previews.dfm).

Caratteristiche:

 

Modifiche della versione 0.3 beta (23 gen 1997):
- implementazione dell'anti-aliasing in Rotate;
- ottimizzazione algoritmo di rotazione;
- disattivazione della proprietà NColors (tutte le immagini saranno trattate a 24 bit, true color);
- correzione bug vari.

Modifiche della versione 0.4 beta (31 gen 1997):
- correzione bug nelle conversioni HSL;
- carica e salva file PaintBrush PCX (lettura 256 colori o true color, scrittura true color);
- correzione bug nell'algoritmo di filtro 3x3;
- preview filtri definiti dall'utente (con 8 filtri predefiniti).

Modifiche della versione 0.5 beta:
- salvataggio e caricamento immagini GIF a 256 colori;
- gestione GIF animate;
- correzione bug e ottimizzazioni varie;
- correzione bug di zoom-in (eliminato effetto griglia);
- compatibilità con Windows NT 4.0;
- nuovo componente THsvBox per la selezione dei colori HSV (Hue Saturation Value);
- aggiunta evento OnViewChange (segnalazione cambiamenti di ViewX/Y e Zoom) e OnImageChange (cambiamenti immagine);
- aggiunta metodo DoPreviews per l'anteprima contemporanea di tutti gli effetti;
- eliminazione dei metodi DoPreviewHSLvar, DoPreviewIntensityRGB, DoPreviewContrast e DoPreviewUserFilter;
- aggiunta metodo HSVvar() e relativa preview;
- aggiunta carica/salva filtri nella preview;
- modifica di TGraphFilter, aggiunta divisore e trasformazione da valori double a integer;
- selezione animata, aggiunta metodo AnimatedSel;
- aggiunta metodo SetDPI() e proprietà DpiX e DpiY;
- aggiunta proprietà Selected;
- aggiunte proprietà IdealComponentWidth e IdealComponentHeight;
- applicazioni effetti anche solo su aree selezionate;
- aggiunta metodo Resample();
- scrollbars visibili solo se necessarie;
- aggiunta metoo CastColorRange()
- implementazione metodo Assign.


TImageEn

METODI:

Input/Output

procedure SaveToFileJpeg(const nf:string; Quality:integer)

Salva l'immagine corrente in formato JPEG.
nf: nome del file, con estensione.
Quality: fattore di qualità, da 1 a 100. Più questo valore è alto e maggiore è la qualità dell'immagine, ma anche la dimensione del file risultante.
Esempio:
imageen1.SaveToFileJpeg('myim.jpg',25);

procedure LoadFromFileJpeg(const nf:string; Quality:boolean);

Carica l'immagine da un file JPEG.
nf: nome del file, con estensione.
Quality: se TRUE il caricamento è più lento in vantaggio della qualità. Se FALSE, al contrario, si avrà maggiore velocità, ma minore qualità.
Esempio:
imageen1.LoadFromFileJpeg('myim.jpg',true);

function LoadFromFileGif(const nf:string; idx:integer; out GifInfo:TGifInfo; out GlobGifInfo:TGlobGifInfo):integer;

Carica un'immagine da un file GIF (87a, 89a e Gif animate).
nf: nome del file, con estensione.
idx: indice dell'immagine da caricare. 0=prima immagine, -1=nessuna.
GifInfo: restituisce struttura TGifInfo contenente informazioni sul singolo fotogramma:
TGifInfo = record
PosX: word; // posizione X
PosY: word; // posizione Y
Width: word; // larghezza
Height: word; // Altezza
DelayTime:word; // tempo attesa (centesimi di secondo)
FlagTranspColor:boolean; // true=è specificato un colore di trasparenza (TransColor è valido)
TranspColor:TRGB; // colore trasparente
Interlaced:boolean; // True=interlacciato
end;

GlobGifInfo: restituisce struttura TGlobGifInfo contenete informazioni sul file Gif:
TGlobGifInfo = record
WinWidth:word; // larghezza finestra
WinHeight:word; // altezza finestra
Background:TRGB; // Colore sfondo
Ratio:byte; // Aspect ratio dx/dy = (Ratio+15)/64
end;

return: numero immagini presenti nel file gif (numero fotogrammi nel caso di Gif animate).
Esempio:
imageen1.LoadFromFileGif('test.gif',0,GifInfo,GloGifInfo); // Carica la prima immagine nel caso di Gif animate o l'unica immagine presente nel file.
numimages:=imageen1.LoadFromFileGif('anim.gif',-1,GifInfo,GlobGifInfo); // assegna a numimages il numero di fotogrammi contenuti nel file anim.gif.

procedure SaveToFileGif(const nf:string; interlaced:boolean; DelayTime:word; TranspBack:boolean; xpos,ypos:integer);

Salva l'immagine in un file GIF (89a) a 256 colori. Il file Gif risultante avrà una sola immagine e non sarà marcato come animato. La quantizzazione da true color a 256 colori è effettuata con l'algoritmo Octree.
nf: nome del file, con estensione.
interlaced: true=salva interlacciato (visualizzazione ottimizzata per visualizzazioni graduali, come internet).
DelayTime: tempo di visualizzazione in centesimi di secondo (utile nel caso successivamente vengano aggiunte altre immagini per formare un'animazione).
TranpBack: true= specifica il colore trasparente nella proprietà Background.
xpos,ypos: coordinate relative dell'immagine.
Esempio:
imageen1.SaveToFileGif('test.gif',false,0,false,0,0); // salva l'immagine corrente
imageen1.SaveToFileGif('anim.gif',true,50,true,0,0); // salva l'immagine corrente come la prima di un'animazione, da tenere per 50 centesimi di secondo e con colore trasparente impostato secondo la proprietà Background.

function InsertToGif(const nf:string; interlaced:boolean; idx:integer; DelayTime:word; TranspBack:boolean; xpos,ypos:integer; winwidth,winheight:integer):integer;

Aggiunge un'immagine ad un file Gif e lo rende animato.
nf: nome del file, con estensione.
interlaced: true=salva interlacciato (visualizzazione ottimizzata per visualizzazioni graduali, come internet).
idx: indice della posizione in cui inserire l'immagine. 0=prima immagine. Se idx è maggiore del numero di immagini già contenute nel file Gif, viene aggiunta alla fine.
DelayTime: tempo di visualizzazione in centesimi di secondo (utile nel caso successivamente vengano aggiunte altre immagini per formare un'animazione).
TranpBack: true= specifica il colore trasparente nella proprietà Background.
xpos,ypos: coordinate relative dell'immagine.
winwidth, winheight: dimensioni della finestra in cui è contenuta l'animazione (a questa fanno riferimento xpos e ypos). Se winwidth e/o winheight valgono -1 vengono calcolate automaticamente in base alla massima dimensione dell'immagine più xpos e ypos.
Esempio:
imageen1.SaveToFileGif('anim.gif',true,50,true,0,0);
// crea file gif con il fotogramma iniziale
imageen1.InsertToGif('anim.gif',true,1,50,true,0,0,-1,-1); // aggiune il secondo fotogramma

class function DeleteGifIm(const nf:string; idx:integer):integer;

Elimina un'immagine da un file Gif.
nf: nome del file, con estensione.
idx: indice dell'immagine da cancellare.
return: numero di immagini rimaste nel file.
Esempio:
// elimina tutte le immagini da un file Gif animato
numimages:=imageen1.EnumGifIm('anim.gif');
for i:=0 to numimages-1 do imageen1.DeleteGifIm('anim.gif',0);
// sostituisce il fotogramma 2 (3° fotogramma) con quello in memoria
imageen1.DeleteGifIm('myanim.gif',2);
imageen1.InsertToGif('myanim.gif',true,2,50,true,0,0,-1,-1);

class function EnumGifIm(const nf:string):integer;

Restituisce il numero di immagini/fotogrammi presenti nel file Gif specificato.
nf: nome del file, con estensione.
return: numero di immagini presenti nel Gif.

class function CheckAniGif(const nf:string):boolean;

Restituisce True se Gif animata.
nf: nome del file, con estensione.
return: True=Gif animata , False=Gif non animata

procedure LoadFromFile(const nf:string);

Carica un file JPEG, BMP, PCX o GIF. Viene riconosciuto il formato dall'estensione. Se questa è .JPG o .JPEG viene chiamata la funzione LoadFromFileJpeg(), con Quality impostata a TRUE.
Se il file è in formato GIF viene caricata solo la prima immagine (nel caso in cui ce ne siano altre).
nf: nome del file, con estensione.
Esempio:
imageen1.LoadFromFile('uno.jpg');
imageen1.LoadFromFile('due.bmp');
imageen1.LoadFromFile('tre.pcx');
imageen1.LoadFromFile('quattro.gif');

procedure SaveToFile(const nf:string);

Salva un file in formato JPEG, BMP, PCX o GIF. Viene riconosciuto il formato dall'estensione. Se questa è .JPG o .JPEG viene chiamata la funzione SaveToFileJpeg(), con Quality impostata a 50.
I formati Jpeg,bmp e pcx vengono salvati in true color.
Il formato Gif viene salvato con 256 colori (quantizzazione Octree), non interlacciato, senza colore trasparente e con tempo di 0 centesimi di secondo.
nf: nome del file, con estensione.
Esempio:
imageen1.SaveFromFile('uno.jpg');
imageen1.SaveFromFile('due.bmp');
imageen1.SaveFromFile('tre.pcx');
imageen1.SaveFromFile('quattro.gif');

Image Processing

procedure Negative;

Converte in negativo l'immagine corrente.
Esempio:
imageen1.Negative; // rende negativa l'immagine corrente

procedure HSLvar(oHue,oSat,oLum:integer);

Varia le componenti HSL (Hue Saturation Luminosity) dell'immagine corrente (o alla selezione corrente).
oHue: offset da applicare alla componente H. Da -180 a +180.
oSat: offset da applicare alla componente S. Da -100 a +100.
oLum: offset da applicare alla componente L. Da -100 a +100.
Esempio:
imageen1.HSLvar(0,0,30); // aumenta il bianco di un fattore 30

procedure HSVvar(oHue,oSat,oVal:integer);

Varia le componenti HSV/HSB (Hue Saturation Value) dell'immagine corrente (o alla selezione corrente).
oHue: offset da applicare alla componente H. Da -180 a +180.
oSat: offset da applicare alla componente S. Da -100 a +100.
oVal: offset da applicare alla componente V. Da -100 a +100.
Esempio:
imageen1.HSVvar(0,0,30); // aumenta la luminosità di un fattore 30
imageen1.HSVvar(0,-40,0); // diminuisce la saturazione del colore di 40

procedure IntensityRGBall(r,g,b:integer);

Varia le componenti RGB (Red Green Blue) all'immagine corrente (o alla selezione corrente)
r,g,b: offset (da -255 a +255) delle tre componenti del colore.
Esempio:
imageen1.IntensityRGBall(15,0,0); // aumenta il rosso di 15
imageen1.IntensityRGBall(0,-30,0); // diminuisce il verde di 30

procedure Contrast(vv:integer);

Varia il contrasto dell'immagine corrente (o della selezione corrente).
vv: offset del contrasto. Da -100 a +100.

procedure ApplyFilter(filter:TGraphFilter);

Applica un filtro 3x3 all'immagine corrente (o alla selezione corrente).
filter: filtro da applicare, di tipo TGraphFilter, definito così:
TGraphFilter = record
Values:array [0..2,0..2] of integer;
// valori filtro
Divisor:integer;
// Divisore
end;

Esempio:
// applica un filtro Emboss
const filter:TGraphFilter= (Values:( (-1,0,1), (-1,1,1),(-1,0,1) ); Divisor:1);
begin
imageen1.ApplyFilter(filter);
end;

procedure ConvertToGray;

Converte l'immagine corrente in scala di grigi. L'immagine viene trattata comunque in true color.
Esempio:
imageen1.ConvertToGray;

procedure Rotate(fangle:double; antialias:boolean);

Ruota l'immagine corrente di un angolo qualsiasi.
fangle: angolo rotazione. Da -359 a +359. I valori positivi indicano il senso antiorario.
antialias: se true effettua un'anti-aliasing (elaborazione più lenta).
Esempio:
imageen1.Rotate(30,true); // ruota di 30 gradi in senso antiorario con antialiasing.

procedure Flip(dir:TFlipDir);

Effettua un capovolgimento orizzontale o verticale dell'immagine.
dir: può essere fdHorizzontal, per orizzontale, fdVertical, per verticale.

procedure Resize(newWidth, newHeight:integer);

Ridimensiona l'immagine corrente, senza perderne il contenuto. Notare che l'immagine corrente non viene adattata alle nuove dimensioni (no stretch).
newWidth, newHeight: valori in pixel della nuova dimensione.
Esempio:
imageen1.Resize(1000,1000); // ridimensiona il campo di lavoro a 1000x1000 pixel.

procedure Resample(NewWidth, NewHeight:integer);

Ridimensiona l'immagine corrente adattandola (stretch) alle nuove dimensioni.
NewWidth, NewHeight: valori in pixel della nuova dimensione. Se uno dei due vale -1 viene calcolato automaticamente, rispettando le proporzioni.
Esempio:
imageen1.Resample(50,50); // ridimensiona l'immagine a 50x50

procedure DoPreviews;

Effettua un cambiamento interattivo e visuale del contrasto, HSV, HSL, RGB e filtri utente, su tutta l'immagine o sulla selezione corrente.

procedure CastColorRange(BeginColor,EndColor,CastColor:TRGB);

Forza un gruppo di colori ad uno specifico.
BeginColor, EndColor: colore iniziale e finale da modificare.
CastColor: colore da assegnare a tutti i colori compresi tra BeginColor e EndColor.
Esempio:
// Trasforma il nero in bianco
imageen1.CastColorRange( CreateRGB(0,0,0),CreateRGB(0,0,0), CreateRGB(255,255,255) );

Taglia, copia & incolla

procedure SelCopyToClip;

Copia la selezione corrente nella clipboard.
Esempio:
// copia un'area di imageen1 in imageen2
imageen1.Select(10,10,100,100);
imageen1.SelCopyToClip;
imageen2.PasteFromClipboard;
imageen1.DeSelect;

procedure SelPasteFromClipStretch;

Incolla il contenuto della clipboard nella selezione corrente (effettua uno Stretch). La selezione deve essere nei confini dell'immagine corrente.

procedure PointPasteFromClip(x1,y1:integer);

Incolla il contenuto della clipboard nella posizione specificata. Le coordinate x1,y1 con la dimensione dell'immagine da incollare possono anche eccedere la grandezza dell'immagine corrente. Quest'ultima sarà ingrandita di conseguenza.
x1,y1: coordinate in pixel dove inserire l'immagine.

procedure SelCutToClip;

Taglia la selezione corrente (riempendola con il colore di Background) nella clipboard.

procedure PasteFromClipboard;

Sostituisce l'immagine corrente con il contenuto della clipboard.

procedure CopyToClipboard;

Copia l'immagine corrente nella clipboard.

procedure Select(x1,y1,x2,y2:integer);

Seleziona una parte dell'immagine. L'area selezionata sarà evidenziata da una linea tratteggiata bianco-nera animata.
x1,y1,x2,y2: rettangolo della selezione.

procedure DeSelect;

Annulla la selezione corrente e nasconde la linea tratteggiata di contorno.

Undo

procedure SaveUndo;

Salva l'immagine corrente, per un successivo comando UNDO. Se è impostata la proprietà AutoUndo non è necessario chiamare questo metodo ogni volta che si modifica l'immagine.
Esempio:
// rende in negativo un'immagine e la salva in PCX (in molti casi viene compressa meglio)
imageen1.SaveUndo;
imageen1.Negative;
imageen1.SaveToFile('alfa.pcx');
imageen1.Undo;
imageen1.ClearUndo;

procedure ClearUndo;

Svuota il buffer UNDO, liberando la memoria per l'immagine salvata.

procedure Undo;

Ripristina l'immagine con quella precedente all'ultima modifica o all'ultimo SaveUndo.

Visualizzazione

procedure Update;

Aggiorna la finestra con le ultime modifiche. Necessario solo se si modifica direttamente la proprietà Bitmap.
Esempio:
// colora di rosso il pixel di coordinate (0,0)
imageen1.Bitmap.canvas.pixels[0,0]:=clRed;
imageen1.Update;

procedure Fit;

Setta lo Zoom in modo che l'immagine entri perfettamente all'interno del componente.

procedure Clear;

Svuota l'immagine corrente. Riempie con colore di Background.

procedure SetDPI(dpiX,dpiY:integer);

Setta il numero il numero di dpi (punti per pollice) orizzontali e verticali. Per ora questa informazione viene caricata e salvata solo per i file PCX.

PROPRIETA':

AutoUndo:boolean

Se TRUE l'immagine sarà ripristinabile dopo l'ultima operazione di modifica (chiama automaticamente SaveUndo).

ScrollBars:boolean

Se TRUE mostra le scrollbar, se FALSE le nasconde.

NColors:TNColors

Numero di colori dell'immagine corrente. L'unico valore correntemente supportato è nc24bit, cioè 16 milioni di colori (True Color).

Background:TColor

Colore di background. Usato come riempimento per aree vuote. Lo stesso colore può essere usato come colore trasparente nelle immagini o animazioni Gif.

ViewX:integer
ViewY:integer

Posizione (in pixel) dell'inizio visualizzazione dell'immagine, qualora questa non entri nei confini del componente.

Zoom:integer

Zoom corrente in percentuale. Il valore minimo è 1 (1% dell'immagine), mentre 100 indica una scala 1:1. Il limite superiore dipende dall'immagine.

DpiX:integer
DpiY:integer

Numero di dpi (punti per pollice) orizzontali e verticali. Per ora questa informazione viene caricata e salvata solo per i file PCX. Vedere anche SetDPI.

AnimatedSel:boolean

Se True abilita la selezione animata (vedi Select).

Bitmap:TBitMap

Bitmap (formato BMP) rappresentante l'immagine corrente. Contiene l'immagine anche se questa è stata caricata in formato JPEG. Non assegnare alcun valore a questo campo.
Per rendere effettive le modifiche chiamare il metodo Update.
Esempio:
imageen1.bitmap.canvas.pixels[0,0]:=clBlue; // Assegna clBlue al pixel 0,0
imageen1.Update;

Selected:boolean

Vale True se è correntemente selezionata un'area a seguito di una Select. Sola lettura.

SelX1:integer
SelY1:integer
SelX2:integer
SelY2:integer

Coordinate della selezione corrente impostate con Select. Valide solo se Selected è True. Sola lettura.

IdealComponentWidth:integer
IdealComponentHeight:integer

Dimensione teorica orizzontale e verticale che il componente dovrebbe avere per contenere l'immagine corrente comprese le ScrollBar (se presenti).

EVENTI:

OnViewChange:TViewChangeEvent

TViewChangeEvent = procedure(Sender: TObject; Change:integer) of object;
Change: 0=variazione di ViewX o ViewY , 1=variazione dello Zoom, 2=variazione immagine
Notifica la variazione delle proprietà ViewX/Y e Zoom.

OnImageChange:TNotifyEvent

Notifica la variazione dell'immagine.

VARIE (non appartenenti alla classe TImageEn):

function TRGB2TColor(rgb:TRGB):TColor;

Converte un valore TRGB in TColor.
TRGB = packed record
b:byte;
g:byte;
r:byte;
end;

function TColor2TRGB(cl:TColor):TRGB;

Converte un valore TColor in TRGB.

procedure RGB2HSL(px:TRGB; var Hue,Sat,Lum:single);

Converte un valore RGB in HSL.
H: Hue, da 0 a 1.
S: Saturation, da 0 a 1.
L: Luminosity, da 0 a 1.

procedure HSL2RGB(var px:TRGB; iHue,iSat,iLum:single);

Converte un valore HSL in RGB.

procedure HSV2RGB(var px:TRGB; H,S,V:integer);

Converte un valore HSV in RGB.
H: Hue, da 0 a 359.
S: Saturation, da 0 a 99.
V: Value, da 0 a 99.

procedure RGB2HSV(RGB:TRGB; var h,s,v:integer);

Converte un valore RGB in HSV.

function CreateRGB(r,g,b:byte):TRGB;

Crea una struttura RGB date le tre componenti r,g,b.

function LoadFilterFromFile(const nf:string):TGraphFilter;

Carica un filtro da file.

procedure SaveFilterToFile(const nf:string; const filt:TGraphFilter);

Salva un filtro su file.


THSVBox

METODI:

procedure SetRGB(r,g,b:byte);

Setta le singole componenti R G B posizionando i cursori HSV nelle posizioni relative. Le proprietà Hue, Sat e Val saranno conseguentemente modificate.
Esempio:
HSVBox1.SetRGB(255,100,100)
h:=HSVBox1.Hue;
s:=HSVBox1.Sat;
v:=HSVBox1.Val;

procedure SetColor(cl:TColor);

Imposta il colore corrente da un colore di tipo TColor. Saranno di conseguenza variate le proprietà Hue,Sat,Val, Red, Green e Blue.
Esempio:
HSVBox1.SetColor(clRed);

PROPRIETA':

Hue:integer
Sat:integer
Val:integer

Rispettivi valori HSV corrispondenti alla posizione corrente dei cursori. Hue (da 0 a 359) è rappresentato dalla barra verticale di destra, Sat (da 0 a 99) è l'asse orizzontale e Val (da 0 a 99) l'asse verticale.

Red:byte
Green:byte
Blue:byte

Corrispondenti valori RGB ricavati direttamente da quelli HSV. Sola lettura.

Color:TColor

Corrispondente valore TColor ricavato direttamente da HSV. Sola lettura.
Esempio:
panel1.color:=HSVBox.color;

 


"This software is based in part on the work of the Independent JPEG Group"


14 marzo 1998, Fabrizio Di Vittorio
fdivitto@caerenet.it
fdivitto@usa.net