Newsgroup: it.comp.lang.delphi
Titolo: aito sull'elaborazione delle immagini

Ho cercato per un giorno intero su internet e ho trovato poco, e quel poco
che ho trovato non fa al caso mio.
Il problema è semplice. Ho una immagine, voglio aumentare la luminosità,
supponiamo di 50 punti su 100, e va tutto bene. La salvo. Apro questa nuova
immagine salvata e voglio diminurne la luminosità di 50 punti su 100, quindi
mi aspetto che l'immagine torni uguale all'originale, e invece niente, viene
completamente diversa. Con Photoshop e Paint Shop Pro funziona a meraviglia
ma come faccio io (e tutti i tool che ho trovato) NO! Secondo me è perchè
sbaglio qualcosa negli algoritmi, nel senso che non sono esattamente l'uno
il contrario dell'altro.
In uno io voglio aumentare il colore di ogni ixel, e nell'altro lo voglio
togliere...... MAH!!!
Algoritmo per aumentare la luminosità:
procedure Lightness(var clip: tbitmap; Amount: Integer);
var
p0:pbytearray;
r,g,b,x,y: Integer;
begin
  for y:=0 to clip.Height-1 do begin
    p0:=clip.scanline[y];
    for x:=0 to clip.Width-1 do
    begin
      r:=p0[x*3];
      g:=p0[x*3+1];
      b:=p0[x*3+2];
      p0[x*3]:=IntToByte(r+((255-r)*Amount)div 255);
      p0[x*3+1]:=IntToByte(g+((255-g)*Amount)div 255);
      p0[x*3+2]:=IntToByte(b+((255-b)*Amount)div 255);
    end;
  end;
end;
Algoritmo per dimuire la luminosità:
procedure Darkness(var src: tbitmap; Amount: integer);
var
p0:pbytearray;
r,g,b,x,y: Integer;
begin
  src.pixelformat:=pf24bit;
  for y:=0 to src.Height-1 do begin
    p0:=src.scanline[y];
    for x:=0 to src.Width-1 do
    begin
      r:=p0[x*3];
      g:=p0[x*3+1];
      b:=p0[x*3+2];
      p0[x*3]:=IntToByte(r-((r)*Amount)div 255);
      p0[x*3+1]:=IntToByte(g-((g)*Amount)div 255);
      p0[x*3+2]:=IntToByte(b-((b)*Amount)div 255);
   end;
  end;
end;
Mi sembra abbastanza chiaro, nel primo ad ogni pixel aggiungo la quantità
calcolata in base al valore ammount che viene scelto tramite una trackbar, e
nel secondo la vado a togliere. Ma allora perchè l'immagine non torna uguale
all'orginale?
Qualcuno ha già fatto qualcosa di questo tipo? Ha risolto o sa dove
sbaglio??
Esiste qualcosa di free che mi possa venire in aiuto?
Grazie

Non ne so molto di questo argomento ma io farei una cosa, giusto x essere
sicuri che il tuo algo funzioni in entrambe le direzioni. Aggiungi questa
funzione al tuo form o data module che sia:
function xxx.AutotestJpg: integer;
var
  ImgFileName: string;
 BmpOriginal: TBitmap;
 BmpAfterAdd: TBitMap
 BmpAfterRemove: TBitMap;
img: TImage;
begin
  Img := TImage.Create(Nil)
  Bmporiginal := TBitmap.create(Nil);
  BmpAfterAdd := TBitMap.Create(nIl);
  BmpAfterRemove :=  TBitMap.Create(Nil)
  try
    ImgFileName := 'c:\immaginetest.jpg';
    img.LoadFromFile(ImgFileName);
    bmporiginal.assign(img.bitmap);
    // applica aumento di luminosita a img.bitmap
    bmpAfterAdd.Assign(img.bitmap);
    // applica decremento di luminosita su img
    bmpAfterremove.Assign(img.bitmap);
   // qui, adesso, fai una comparazione di bytes tra BmpOriginal e
BmpAfterRemove e vedi se sono uguali...
   // se non lo sono, qualcosa non va!
 finally
   // free di tutti gli oggetti creati
end;
Ancora, potresti create un metodo come questo per ogni formato di immagine
che vuoi trattare:
bmp
jpg
gif
tiff
tga
...
Bye
A
--
Per rispondere non usare il reply ma scrivere al seguente indirizzo:
alsalvati(at)
supereva.it

Siamo scarsini in matematica eh?
Aumentare di 50 su 100 vuol dire aumentare del 50%: e porti il valore di
luminosita' (giusto per capirci) a 150.
Quando sei a 150 per tornare al valore di luminosita' originale 100 non devi
togliere il 50%, ma il 33,3 periodico % della luminosita' attuale
dell'immagine.
Ciao, Sandro

> Siamo scarsini in matematica eh?
Lo ammetto è, vero :\ ma non è il problema.
ho una trackbar lunga 200, quando la apro è a 100. tutti i numeri da 100 a
200 aumentano la luminosità, da 100 a 0 la diminuiscono.
Ho aperto una immagine e ho aumentato a 50 la luminosità, l'ho salvata.
Poi l'ho fatta diventare più scura di 33, e l'immagine era scurissima. Il
fatto è che quando la vado a mettere scura io agisco su una immagine già
modificata. Quando diventa + scura non lo diventa scura allo stesso modo di
come lo diventerebbe se agissi sull'immagine originale. Si vede ancora che
non è stata tolta la luminosità di prima. quindi l'immagine mantiene la
luminosita di prima (per capirci quella patina bianca stile nebbia) e in più
viene tutta inscurita. Quindi mi ritrovo un'immagine scura e patinata, un
vero schifo
Saluti

 Poi l'ho fatta diventare più scura di 33, e l'immagine era scurissima.
il che puo' voler dire due cose:
1) l'algoritmo per scurire l'immagine non e' corretto o comunque non
funziona come dovrebbe rispetto al parametro 33
oppure
2) nello schiarire l'immagine hai alterato i colori in modo irreversibile
(era gia' chiara di suo all'inizio?) ; e' un problema comune anche ai
programmi di fotoritocco che, non a caso, hanno l'UNDO proprio per
recuperare un'immagine dopo un'elaborazione: un'elaborazione, esattamente
contraria, successiva, infatti, non riporterebbe all'immagine iniziale, per
questo serve l'undo.
Ciao, Sandro

> Esiste qualcosa di free che mi possa venire in aiuto?
Forse...
http://openil.sourceforge.net/
Marco Kregar
marco....@firebirdsql.it
www.firebirdsql.it

 questo serve l'undo.
Ok, io l'undo non lo metto, però Photoshop e PSP funzionano bene :))
Sarà perchè costano anche una cifra... però m da fastidio un sacco non
riuscire a fare questa cosa...
Saluti

> 
http://openil.sourceforge.net/
Ho trovato quello che dici ma non trovo la versione per delphi, o meglio io
ho scaricato il pacchetto ma nono capisco come possa andare installato....
non riusciresti a darmi una mano?
Grazie