Newsgroup: it.comp.lang.delphi
Titolo: Problemi di grafica ....

Ciao a tutti,
      ho un problema nel gestire il disegno di una TGraphic in un canvas di 
un pannello.
Cerchero' di essere il piu' chiaro possibile
Ho un pannello che contiene un TImage, il TImage ha settato su true la 
proprieta' Strech e l' Align e' settato su alClient.
Carico un'immagine quasiasi all'interno del TImage con 
TImage.LoadFromFile(FileName) e questa si adatta al suo contenitore.
In un'altro pannello dovrei disegnare, alle coordinate x,y, l'immagine 
contenuta nel TImage.
Ecco il problema, utilizando il Panel1.Canvas.Draw(X,Y,IM1.Picture.Graphic) 
mi disegna l'immagine alle coordinate X,Y (com'e' ovvio) ma l'immagine che 
disegna e' quella originale non strecciata (che termine !!!).
Come posso fare per disegnare l'immagine strecciata contenuta nel TImage ???
Considerate che l'immagine viene messa sul pannello *DOPO* aver disegnato 
una serie di stringhe e che la posso spostare in verticale ed orizzontale 
(ma questo non e' un problema ....), quindi se il TImage ha Heigth=50 e 
Width=50 (e' sempre un quadrato), nel panello laterale (che in estrema 
sintesi raprresenta un output in real time di quello che si andra' a 
sampare) l'immagine deve essere contenuta in una regione di 50x50.
Quello che ottengo e' che alle coordiante x,y disegno l'immagine originale 
non adattata.
Come posso fare ???
Stavo pensando di salvare su disco una bitmap temporanea con le nuove 
dimensioni ..... ma ogni volta che allargo/stringo l'immagine la devo 
risalvare tutte le volte il tutto rallenta .... che dite e' fattibile ??? o 
c'e' qualcosa di piu' efficiente ???
Grazie di tutto,
Ciao,
Daniele
__________ Information from ESET NOD32 Antivirus, version of virus signature database 4495 (20091010) __________
The message was checked by ESET NOD32 Antivirus.
http://www.eset.com

prova a vedere, poi ï¿œ da ottimizzare-
procedure TForm1.Button1Click(Sender: TObject);
Var c1,c2,c3,c4,appx1,appx2,appy1,appy2 : Integer;
  Procedure x2x(x:Integer);
  Begin
    appx1 := x * im1.width div im1.picture.width;
    appx2 := ((x+1) * im1.width div im1.picture.width)-1;
  End;
  procedure y2y(y:Integer);
  Begin
    appy1 := y * im1.height div im1.picture.height;
    appy2 := ((y+1) * im1.height div im1.picture.height)-1;
  End;
begin
  for c1 := 0 to im1.picture.Width-1 do
  begin
    for c2 := 0 to im1.picture.height-1 do
    begin
      x2x(c1);
      y2y(c2);
      for c3 := appx1 to appx2 do
      begin
        for c4 := appy1 to appy2 do
        begin
          label1.canvas.pixels[c3,c4] := 
Im1.picture.bitmap.canvas.pixels[c1,c2];
        end;
      end;
    end;
  end;

Daniele ha scritto:

Prova ad usare .Canvas.StretchDraw(...), Giorgio

Ciao,
  grazie per la risposta rapida ....
Dando un'occhiata al codice che hai riportato, ho cercato una scorciatoia
che pero' non ha dato i risultati sperati.
Ecco cosa ho fatto ...
Il TImage e' settato con Align a alClient ed e' dentro ad un TPanel che
posso ingrandire o rimpicciolire (ma sempre restando un quadrato).
Visto e considerato che anche il TImage ha un suo canvas, ho pensato di fare
una cosa del genere (Questo perche' la dimensione del TImage e l'area
di stampa sono uguali (1:1) ovvero IM1.Width=50 e IM1.Height=50 sara'
stampato in una regione 50x50.
For PixX:=0 To IM1.Width-1 Do
Begin
    For PixY:=0 To IM1.Height-1 Do
    Begin
        PE.Canvas.Pixels[PixX+SP1.Value,PixY+SP2.Value]:=IM1.Canvas.Pixels[PixX,PixY];
    End;
 End;
Dove SP1.Value e SP2.Value rappresentano il punto da dove inizio a inserire
i pixel nel pannello (gli offset).
Il risultato e' ...... non copia niente ....
Inoltre io non so quale tipo di immagine viene caricata tra .BMP, JPG, ICO o
altro ........
Dove sto sbagliando ???
Grazie, ciao
Daniele
__________ Information from ESET NOD32 Antivirus, version of virus signature database 4496 (20091010) __________


 Prova ad usare .Canvas.StretchDraw(...), Giorgio
Ho provato ..... non va ....
Devo *_solo_* copiare il contenuto della TImage (gia' adattata) in una 
regione di uguali dimensioni, (ma con offset diversi) di un pannello.
Considera che puo' essere caricato di tutto, BMP,GIF,JPG,ICO ecc....
Grazie e ciao
Daniele
__________ Information from ESET NOD32 Antivirus, version of virus signature database 4496 (20091010) __________


prova in questo modo
ImageTemp.Canvas.Draw(0,0,ImagePart.Picture.Graphic);
label1.Canvas.CopyRect(Label1.ClientRect,ImageTemp.Canvas,ImagePart.ClientRect);
ImagePart ï¿œ la tua immagine di partenza
AutoSize=True
Align=alNone ( non allineata)
Stretch=False
ImageTemp un un TImage con caricata una bitmap (BMP) bianca ( o di 
colore neutro ) con
AutoSize=True
Align=alNone ( non allineata)
Stretch=False
Label ï¿œ la tua label allineata al client di un pannello.
dovrebbe funzionare sia con le icone che con le bitmap.

Daniele ha scritto:

Perche' nel pannello non ci metti una uguale TImage impostata allo 
stesso modo e la passi ad esempio con .assign(), oppure ci passi solo la 
TGraphics contenuta con assign(), e' da provare. Dovrebbe mostrarti 
l'identica figura.
ciao giorgio

Giorgio Padoan ha scritto:

Osserva che c'e' l'opzione per disegnarla in tutto il rettangolo 
occupato dalla Timage. Pensavo che forse e' meglio passarla usando gli 
Stream altrimenti altera le proprieta' che gli assegni:
es.
Ti crei un TMemoryStream -> MemS
Image1..Graphic.SavetoStream(MemS);
MemS.Position:=0;
Image2..Graphic.LoadFromStream(MemS);
Distruggi lo MemTs
ciao giorgio

Ciao,
  ho due notizie ..... una bella e l'altra discreta !!
La bella, dopo aver provato delle soluzioni che non hanno portato a nulla 
(quindi chiamarle soluzioni e' fuorviante eheheheh) ho preso pari pari il 
tuo codice e l'ho brutalmente inserito nel mio con l'unica modifica di aver 
considerato gli offset x,y da sommare ai tuoi valori c3,c4 ottenuti con le 
procedure x2x e y2y.
Con te HO RISLTO IL PROBLEMA DELL'IMAGE RESIZE .......
Quindi quando passi ne Gallaratese dillo in anticipo che hai un caffe' che 
ti reclama :-))).
Ora quella discreta, la procedura funziona solo con le BitMap, e non con le 
gif e jpg.
Pensavo di fare una converisone al volo e convertie le gif,jpg ecc... in 
memoria e assarle poi al IM1.
Ho trovato in rete questo sito dove spiegano come fare un resize di 
un'immagine, ma anche questo usa le bitmap.
http://home.hccnet.nl/david.dirkse/math/bitmap/resize.html
Inoltre, tanto per complicare le cose, quello che ho disegnato sul pannello 
lo devo anche disegnare sull'etichetta in fase di stampa ...... ma questo e' 
un problema che affrontero' dopo .......
Grazie ancora ....
Ciao, Daniele 
