Newsgroup: it.comp.lang.visual-basic
Titolo: [!] Errori di visualizzazione con l'API StretchBlt

Se provate a fare un programma di visualizzazione di immagini ridimensionate
utilizzando l'Api StretchBlt, vi accorgerete presto che quando si riduce
l'immagine, su alcuni PC (mi sembra di aver capito che il problema si
presenti da Windows 2000 in poi) capitano dei brutti cambi di colore tra un
pixel e l'altro, che rendono l'immagine quasi incomprensibile quando si
riduce a meno del 25%.
Dopo qualche giorno di prove e indagini, ho capito come risolvere il
problema: bisogna chiamare la SetStretchBltMode prima della StretchBlt e
settare la modalità ad HalfTone (4).
Per evitare di stressare il sistema, è consigliato chiamare prima  la
GetStretchBltMode e chiedere se per caso il valore è già HalfTone, e in caso
contrario settarlo con la SetStretchBltMode.
Posto qui, con la speranza di aver risolto il problema anche a qualcun
altro. Adesso posso anche ridedicarmi all'organizzazione del meeting. ;-)
Ciao
*Roby*

 altro. Adesso posso anche ridedicarmi all'organizzazione del
meeting. ;-)
semplice. non devi ridurre:
    stretchPpprdll_fngh, cucina.hdc, 0, 0, scalewidth, scaleweight,
j.hdc, 0, 0, scalewidth, scaleweight, srcmultiply
anche tu incuriosito dagli sfondi, eh ?
let's go to napoleone in prima serata.
tnx,
j.nap 'sonnellino

 riduce a meno del 25%.
CUT
Prima di perdermi in dolorose prove grafiche vorrei sfruttare la tua
esperienza con la suddetta api.
A quanto ho capito .. è in grado di eseguire uno zoom di una immagine
(PictureBox ad esempio).
Ho provato il metodo PaintPicture con risultati deludentissimi in quanto
sotto una certa scala inizia a perdere i pezzi di immagine e sopra ad
un'altra scala da' qualche errore strano... oltre tutto questo, il ridisegno
è lentissimo (ci impiega anche una decina di secondi).
Questa API potrebbe fare al caso mio .... dici di tentare ?
Grazie

lo sfondo dio un form fatto con bitblt e' circa 100-500 volte piu'
veloce che fatto con un image ripetuto.
--
ciao, j.
www.sundaysw.com
"Fox Mulder" <fili...@NOSPAMtiscali.it> ha scritto nel messaggio
news:an12no$jou$1...@fe1.cs.interbusiness.it...


ps
se pero' tra irfanview, che di suo e' un gran bel programma, e
photoshop in resampling e stampa c'e' un abisso, e c'e', vuol dire che
gli algoritmi contano.

 wrote in message
news:an1e36$a62jm$1...@ID-51318.news.dfncis.de...

Capisco .. ma l'api di cui parlava Roberto è più veloce o no .. altrimenti
neanche mi cimento (o meglio .. cemento) in questa cosa.
Grazie

 neanche mi cimento (o meglio .. cemento) in questa cosa.
il ricorso alle funzioni dell'api, per quanto ho visto, rende _sempre_
piu' veloce il codice, e di parecchio, che l'uso dei controlli. vale
in genere per l'uso del codice, se hai visto il timing che ho fatto
con il codice di giox per recuperare le dimensioni di gif e jpeg. ne
ho ricavato un esempio che ho messo da me, sez. code.
nello specifico, sulla distorsione mi sembra di ricordare altri post
su altri ng che lamentavano quel problema. sospetto che la stretchblt
faccia un'operazione hw un po' brutale. ma se non e' la foto della
kidman magari il gioco vale la candela. si tratta di fare qualche
prova, con la fx api e con pshop, per esempio, che sul resize bicubico
di un'immagine grossa ci pensa un bel po'.
con gli esempi allapi, cmq, qualche prova dovresti poterla fare
velocemente, senza cementartici troppo :) -- e comunque e' tutta utile
esperienza.
ciao, a.

 (PictureBox ad esempio).
Certo. Segui passo passo l'esempio:
Crea un progetto.
Nella form Form1 inserisci una picturebox, lasciando il nome di default
(picture1)
Inseriscigli nella Picture1 una immagine a scelta
Poi copia questo codice nella tua form1:
Option Explicit
Private Declare Function StretchBlt Lib "gdi32" _
   (ByVal hdc As Long, ByVal x As Long, ByVal Y As Long, _
   ByVal nWidth As Long, ByVal nHeight As Long, _
   ByVal hSrcDC As Long, ByVal xSrc As Long, _
   ByVal ySrc As Long, ByVal nSrcWidth As Long, _
   ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
Private Declare Function SetStretchBltMode Lib "gdi32" _
   (ByVal hdc As Long, ByVal nStretchMode As Long) As Long
Private Declare Function GetStretchBltMode Lib "gdi32" _
   (ByVal hdc As Long) As Long
Const HALFTONE = 4
Const SRCCOPY = &HCC0020
Const PIXEL = 3
Private Sub Form_Load()
      Me.ScaleMode = PIXEL
      Picture1.ScaleMode = PIXEL
      Picture1.Visible = True
      Picture1.AutoRedraw = True
      Picture1.AutoSize = True
      Picture1.Move -Picture1.Left, -Picture1.Height
End Sub
Private Sub Form_Resize()
      Dim lSuccess As Long
      If GetStretchBltMode(Me.hdc) <> HALFTONE Then
          SetStretchBltMode Me.hdc, HALFTONE
      End If
      lSuccess = StretchBlt(Me.hdc, 0, 0, Me.ScaleWidth, _
          Me.ScaleHeight, Picture1.hdc, 0, 0, _
          Picture1.ScaleWidth, Picture1.ScaleHeight, SRCCOPY)
      Me.Refresh
End Sub
Manda in esecuzione, acchiappa un angolo della tua form col mouse, e
divertiti a ridimensionarla.
Ciao
*Roby*
P.S.
Poi, se vuoi vedere il problema che segnalavo, concella le 3 riche che
chiamano la GetStretchBltMode e la SetStretchBltMode, e riprova,
rimpicciolendo molto la finestra (usa una immagine con molti colori, o con
un effetto degradante).

 anche tu incuriosito dagli sfondi, eh ?
Non proprio. E' il mio visualizzatore di immagini con zoom incorporato che
stava dando i numeri...
Ciao
*Roby*

 Certo.
CUT
Grazie ... di più non potevo chiedere e mi sarà sicuramente preziosissimo
... lo applicherò subito al mio componente ... se vengo al meeting questo mi
costerà un grossa birra !
Saluti