Problema nel ruotare immagini VB

di il
32 risposte

32 Risposte - Pagina 2

  • Re: Problema nel ruotare immagini VB

    Io la sto provando sul web, visto che a me serve in quel modo. e continua a farmi lo scherzo che ti ho detto prima. ovvero mi crea un immagine con bordi anche dove non dovrebbero essere come ti ho linkato (http://imageshack.us/photo/my-images/845/aaafatoriginal.jpg/)


    sapete inoltre dirmi se esiste un modo per far si che le immagini vengono addrizzate automaticamente invece che farlo a mano?
  • Re: Problema nel ruotare immagini VB

    Ciao gnufy
    Ho corretto un errore che si presentava quando la risoluzione del' immagine era diversa da 96 dpi (il valore di default). Si tratta di una sola riga (c' è un commento nel codice) ed era la causa di tutto quello spazio nero.

    Ho scritto un progetto web di test e funziona correttamente. Ecco il codice (è in asp.Net):
    Parte HTML
    
    <%@ Page Language="VB" AutoEventWireup="false" CodeFile="TestRotation.aspx.vb" Inherits="TestRotation" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
            <asp:HiddenField ID="HiddenField_Angle" runat="server" Value="0" />
            <h1>Test Rotazione</h1>
            <asp:Button ID="ButtonRotate" runat="server" Text="Rotate" onclick="ButtonRotate_Click" />
            <asp:Button ID="ButtonRestore" runat="server" Text="Restore" onclick="ButtonRestore_Click" />
            <br /><br /><br /><br /><br />
            <asp:Image ID="Image1" runat="server" ImageUrl="~/images/TestFattura.jpg" />
        </form>
    </body>
    </html>
    
    Parte VB
    
    Imports System.Drawing
    Imports System.Drawing.Imaging
    Imports System.Drawing.Drawing2D
    
    Partial Class TestRotation
        Inherits System.Web.UI.Page
    
        Protected Sub ButtonRotate_Click(sender As Object, e As System.EventArgs) Handles ButtonRotate.Click
            Dim angle As Double
            If Not Double.TryParse(HiddenField_Angle.Value, angle) Then
                Return
            End If
    
            angle += 10
            HiddenField_Angle.Value = angle.ToString()
    
            Dim bmpOriginal As Bitmap = New Bitmap(Server.MapPath("images/TestFattura_ori.jpg"))
            Dim bmpRotated As Bitmap = Rotation(bmpOriginal, angle)
            bmpRotated.Save(Server.MapPath("images/TestFattura.jpg")) ' *** Il mome è diverso dall' originale, che non deve essere modificato ***
            bmpOriginal.Dispose()
            bmpRotated.Dispose()
    
            Image1.ImageUrl = "images/TestFattura.jpg"
    
        End Sub
    
        Private Function Rotation(ByVal img As Bitmap, ByVal degree As Double) As Bitmap
            Dim a = Math.Abs(Math.Cos(degree * Math.PI / 180))
            Dim b = Math.Abs(Math.Sin(degree * Math.PI / 180))
            Dim w As Integer = img.Width * a + img.Height * b
            Dim h As Integer = img.Height * a + img.Width * b
            Dim center As PointF = New PointF(w / 2, h / 2)
    
            Dim matrix As New System.Drawing.Drawing2D.Matrix
            matrix.RotateAt(degree, center)
    
            Dim bitmap As New Bitmap(w, h)
            bitmap.SetResolution(img.HorizontalResolution, img.VerticalResolution) ' corregge un errore di risoluzione
    
            Dim g As Graphics = Graphics.FromImage(bitmap)
            g.FillRectangle(Brushes.Red, 0, 0, w, h)     ' Disegna lo sfondo rosso
    
            g.Transform = matrix
            g.DrawImage(img, CInt((w - img.Width) / 2), CInt((h - img.Height) / 2))
            Return bitmap
        End Function
    
        Protected Sub ButtonRestore_Click(sender As Object, e As System.EventArgs) Handles ButtonRestore.Click
            HiddenField_Angle.Value = "0"
            System.IO.File.Copy(Server.MapPath("images/TestFattura_ori.jpg"), Server.MapPath("images/TestFattura.jpg"), True)
            Image1.ImageUrl = "images/TestFattura.jpg"
        End Sub
    End Class
    
    Nota che l' angolo totale lo tengo in una variabile hidden, in TestFattura_ori.jpg c' è l' immagine originale che non viene mai sovrascritta, l' immagine che viene visualizzata è TestFattura.jpg.

  • Re: Problema nel ruotare immagini VB

    Buongiorno, mi intrufolo nella discussione....
    Io ho provato ad eseguire il codice VB (con la correzione della risoluzione) e tutto funziona tranne (io credo) la posizione centrale dell'immagine.
    L'immagine ruota, ma si sposta dal suo centro iniziale (ho usato una immagine quadrata da 301x301 pixel) una rosa dei venti per simulare una bussola, come mai ?
    Grazie.
  • Re: Problema nel ruotare immagini VB

    Ciao milot
    era una discussione di un paio di mesi fa e non ho più il codice, visto che lo hai appena scritto lo posteresti? Cosi non devo riguardare tutto il thread e partiamo dal tuo esempio.
  • Re: Problema nel ruotare immagini VB

    Public Class FormMain
      
        Private percorso As String = "C:\Documents and Settings\Marcello\Desktop\Programmi scaricati" & "\"
        Private BMP As New Bitmap(percorso & "test1.jpg")
        Private Function Rotation(ByVal img As Bitmap, ByVal degree As Double) As Bitmap
            Dim a = Math.Abs(Math.Cos(degree * Math.PI / 180))
            Dim b = Math.Abs(Math.Sin(degree * Math.PI / 180))
            Dim w As Integer = img.Width * a + img.Height * b
            Dim h As Integer = img.Height * a + img.Width * b
            Dim center As PointF = New PointF(w / 2, h / 2)
    
            Dim matrix As New System.Drawing.Drawing2D.Matrix
            matrix.RotateAt(degree, center)
    
            Dim bitmap As New Bitmap(w, h)
            bitmap.SetResolution(img.HorizontalResolution, img.VerticalResolution) ' corregge un errore di risoluzione
            Dim g As Graphics = Graphics.FromImage(bitmap)
            'g.FillRectangle(Brushes.Red, 0, 0, w, h)            ' colora lo sfondo di rosso
    
            g.Transform = matrix
            g.DrawImage(img, CInt((w - img.Width) / 2), CInt((h - img.Height) / 2))
            Return bitmap
        End Function
    
        Private Sub FormMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
            With num_angolo
                .Minimum = -1
                .Maximum = 360
                .Value = 0
            End With
    
            With PictureBox1
                .SizeMode = PictureBoxSizeMode.AutoSize  '.Normal, ecc...
                .Image = BMP
            End With
            
        End Sub
    
        Private Sub num_angolo_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles num_angolo.ValueChanged
    
            If num_angolo.Value = num_angolo.Maximum Then num_angolo.Value = num_angolo.Minimum + 1
            If num_angolo.Value = num_angolo.Minimum Then num_angolo.Value = num_angolo.Maximum - 1
    
            PictureBox1.Image = Rotation(BMP, num_angolo.Value)
    
    
    
        End Sub
    End Class
  • Re: Problema nel ruotare immagini VB

    Sul form è presente un controllo NumericUpDown dove incremento e decremento i gradi ed una picturebox.
    Utilizzo VB 2010 Express
  • Re: Problema nel ruotare immagini VB

    Ho risolto ingrandendo la PictureBox e impostando la proprieta PictureBoxSizeMode centerimage.
    Anche se il centro dell'immagine oscilla un pochino (credo per una questione di arrotondamenti)
    Non riesco invece a visualizzare la trasparenza dell'immagine usata.
    E' possibile ? (immagine jpg)
    Grazie !
  • Re: Problema nel ruotare immagini VB

    Ciao milot
    ho visto quello che dici. In effetti sembra strano ma ha una sua logica

    Al PictureBox metti BorderStyle = FixedSingle cosi si capisce meglio cosa succede, e poi premi il bottone per farla ruotare, vedrai che la rotazione avviene in un certo modo (non possiamo dire che è sbagliata, magari non è ciò che vogliamo).

    Poi nel codice metti .SizeMode = PictureBoxSizeMode.StretchImage vedrai un altro comportamento.

    Bene, ora che ho ripreso confidenza col problema possiamo discutere di che effetto vogliamo ottenere.
  • Re: Problema nel ruotare immagini VB

    Per la trasparenza ho risolto con una gif al posto del jpg.

    Appena riesco posto qualche immagine...
  • Re: Problema nel ruotare immagini VB


    Immagine 1
  • Re: Problema nel ruotare immagini VB


    Immagine 2
  • Re: Problema nel ruotare immagini VB

    Devo ammettere che il risultato mi soddisfa abbastanza (siamo ancora alle bozze), anche se avrei in mente altri strumenti...

    Sto realizzando una interfaccia grafica verso un ricevitore GPS bluetooth, con il controllo serialport e sono a buon punto.

    Una domanda, è possibile 'scalare' l'immagine e i controlli associati (per ingrandire o ridurre le dimensioni dello strumento al volo) ?

    Grazie.
  • Re: Problema nel ruotare immagini VB

    Ciao milot
    quello di scalare un form con tutti i suoi controlli lo puoi fare in WPF, hai mai provato ad usarlo?
  • Re: Problema nel ruotare immagini VB

    Non saprei, io provengo da VB6 e sinceramente sto avendo qualche difficoltà...che differenze ci sono ?

    Comunque aggiungo la foto del lavoro finale sulla bussola
  • Re: Problema nel ruotare immagini VB


    https://plus.google.com/u/0/photos/101753416980603222155/albums/5748766522055369041/5749059056039590914?tab=wX
Devi accedere o registrarti per scrivere nel forum
32 risposte