Newsgroup: it.comp.lang.visual-basic
Titolo: Stampare immagini ruotate

Qualcuno conosce il modo di stampare (su stampante) una immagine
ruotata?
Grazie
GB
Sent via Deja.com
http://www.deja.com/

Grazie
Beh, puoi ruotare tutti i pixel intorno ad un punto, ma il processo è molto
lento fatto in VB.
Sicuramente c'è qualche soluzione migliore.
Non mi risulta però nessuna ape in grado di farlo.
Ciao

 Non mi risulta però nessuna ape in grado di farlo.
se c'e' interesserebbe anche me.
ma anche photoshop ci mette un tantinello...

 ha scritto nel messaggio
news:92dm4u$6obn1$1...@ID-51318.news.dfncis.de...

Con questo sistema ruoto un'immagine di 90 gradi da un controllo Picture a
un'altro, se al posto dell'hdc di Picture2 uso l'hdc diuna stampante
dovrebbe stamparla, non ho provato perchè non ho collegato la stampante.
Option Explicit
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC 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 dwRop As Long)
As Long
Private Sub Command1_Click()
    Dim lngX As Long
    Dim lngY As Long
    Dim lngRet As Long
    Picture2.Width = Picture1.Height
    Picture2.Height = Picture1.Width
    For lngY = 1 To Picture1.Height
        For lngX = 1 To Picture1.Width
            lngRet = BitBlt(Picture2.hDC, Picture1.Height - lngY, lngX, 1,
1, Picture1.hDC, lngX, lngY, &HCC0020)
        Next lngX
    Next lngY
End Sub
C'è un solo problema, (al di la della risoluzione), devo eseguire la
procedura 2 volte perchè dopo la prima ne cancella un pezzo e non riesco
proprio a capire xché, misteri di VB (con questo non intendo che non mi
capisco :-)))
Ciao VB

 ha scritto

:))
grazie 1000 per il codice. anche se non si puo' mandare sulla stampante, al
massimo basta stampare il 2. picturebox.

 ha scritto nel messaggio
news:92dsbp$6st65$1...@ID-51318.news.dfncis.de...

Sull'MSDN alla voce hDC dice:
...
Osservazioni
Questa proprietà è un handle del contesto di periferica dell'ambiente
operativo Windows. Nell'ambiente operativo Windows la visualizzazione di
sistema viene gestita tramite l'assegnazione di un contesto di periferica
per l'oggetto Printer e per ciascun form e ciascun controllo PictureBox
dell'applicazione. È possibile utilizzare la proprietà hDC per fare
riferimento all'handle per il contesto di periferica di un oggetto. Verrà
fornito un valore da passare alle chiamateAPI di Windows.
...
Da qui ho dedotto che se all'API BitBlt gli passo come destinazione l'hDC
della stampante questa stampa. Se domani non faccio tardi attacco la
stampante e provo.
Ciao VB

End Sub
Scusa ma perchè invece della BitBlt() non usi la Get/SetPixel()?
Dovrebbe anche essere più veloce (la funzione è più semplice anche se ne
devi usare 2)
Poi, cosa che accelererebbe molto è l'uso di una var hDC long fuori dal
ciclo anzichè usare le prop. Picture.hDC
Purtroppo questa sub ruota solo a 90° :(
Esiste anche un sistema per vedere la Picture come array di pixel e quindi
aumentare ancora la velocità e la flessibilità, ma qui diventerebbe lungo...
Ciao

 aumentare ancora la velocità e la flessibilità, ma qui diventerebbe
lungo...
dai, zanna, sei tutti noi !
c-o-d-i-c-e, c-o-d-i-c-e !
:)

Giulio:
  esiste l' API PlgBlt che ti permette di copiare e ruotare immagini:
Prova il seguente codice da mettere in un Form con due PictureBoxes ed
un CommandButton:
	Option Explicit
	Private Declare Function PlgBlt& Lib "gdi32" (ByVal hdcDest As Long, lpPoint As _
	POINTAPI, ByVal hdcSrc As Long, ByVal nXSrc As Long, ByVal nYSrc As Long, ByVal _
	nWidth As Long, ByVal nHeight As Long, ByVal hbmMask As Long, ByVal xMask As _
	Long, ByVal yMask As Long)
'
	Private Type POINTAPI  '  8 Bytes
     		x As Long
     		y As Long
	End Type
	Dim Vertici(0 To 2) As POINTAPI
Private Sub Command1_Click()
'
'
    	Dim R&
'
    	Vertici(0).x = 0
    	Vertici(0).y = 100
    	Vertici(1).x = 150
    	Vertici(1).y = 0
    	Vertici(2).x = 150
    	Vertici(2).y = 200
'
    	R = PlgBlt(Picture2.hDC, Vertici(0) _
    	, Picture1.hDC, 0, 0, 100, 100 _
    	, 0, 0, 0)
'
'
'
End Sub
Nel Picture1, scalato in [pixels] metti l' immagine da ruotare:
nell' esempio e' un BMP di 100 x 100 [pixels].
Quando "clicchi" su Command1 l' immagine viene copiata e ruotata
in Picture2.
Per definire l' angolo di rotazione devi definire opportunamente
i Vertici() (un po' di trigonometria non fa' mai male :-)).
Per la stampa non ci dovrebbero essere ulteriori problemi.
Ciao, spero che sia quello che vuoi e fammi sapere se hai problemi.
Franco



La sub l'ho buttata giù velocemente senza pensarci troppo,in effetti l'uso
di 2 variabili HDC più delle variabili per le dimensioni, riducono di un
terzo la velocità. Ho usato BitBlt perchè la conosco, mentre GetPixel e
SetPixel le ho 'scoperte' ora (le API non le conosco molto), comunque le ho
provate ed é risultato più lento (più giù ho messo i tempi di riferimento.)
L'ho ruotata solo di 90° perchè mi pareva fosse quello che era stato
chiesto, aspetta che controllo :))
<rewind>
no diceva:
 <stampare (su stampante) una immagine ruotata?
comunque non è difficile ruotarla di 180 o 270 se serve posto il codice(il
tempo di tirarlo giù.
Ciao VB
Tempi di riferimento per ruotare di 90° un'immagine di 283x212 pixel 50
volte.
Senza API (Point e Pset) 250 sec.
GetPixel SetPixel 7.192 sec.
BitBlt 4.589 sec.
StrechBlt 4.487 sec. (Stranamente e leggermente più veloce)
Mi giunge ora dalla regia (Franco Languasco) che esiste una API chiamata
PlgBlt: nessun ciclo un'unica operazione, e il gioco è fatto. Dopo la provo.
Arri CiaoVB

 ha scritto nel messaggio
news:3A4B893B...@MCLINK.IT...

Cosě non funziona (non succede niente), non c'č qualche errore nell'uso
della variabile Vertici?
Ciao VB


Un'esempino .ino  ino? :)
Grazie
Ciao VB

A tutti gli interessati all' argomento:
  ho mandato a Valter il progettino con cui ho provato l' API
con la preghiera di provarlo e poi inviare le eventuali
correzioni all' NG. Io sto partendo per un viaggetto
di fine anno e ho l' aereo che mi aspetta.
Ciao e buon anno a tutti.
Franco


 ha scritto


 grazie e auguri :)
Sia maledetto chi mal pensa.
--
Ciao :-)
Maurizio
--------
?SPQR(C)
 X
--------

 ha scritto nel messaggio
news:3A4DAD83...@MCLINK.IT...
