Problema nel ruotare immagini VB

di il
32 risposte

Problema nel ruotare immagini VB

Salve è il mio primo post ho letto il regolamento e nn ho capito se posso pubblicare il mio codice che mi crea dei problemi, in quanto preso sicuraemnte da un altro forum.

cmq il mio problema riguarda la rotazioni di immagini di X gradi scritto in linguaggio vb.

posso postare il codice?

32 Risposte

  • Re: Problema nel ruotare immagini VB

    gnufy ha scritto:


    in quanto preso sicuraemnte da un altro forum.
    Mi raccomando non prendere mai software dagli sconosciuti e non frequentare forum poco raccomandabili!
    Se ti possono servire, con queste funzioni puoi ruotare una PictureBox:
    
    Private Function Rotate(ByVal degree As Double, ByVal l As Double, ByVal h As Double) As Double
         Return l * Math.Abs(Math.Cos(degree * Math.PI / 180)) +
               h * Math.Abs(Math.Sin(degree * Math.PI / 180))
    End Function
    
    Private Function Rotation(ByVal img As Bitmap, ByVal degree As Double) As Bitmap
        Dim w As Integer = Rotate(degree, img.Width, img.Height)
        Dim h As Integer = Rotate(degree, img.Height, img.Width)
        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)
        Dim g As Graphics = Graphics.FromImage(bitmap)
        g.Transform = matrix
        g.DrawImage(img, CInt((w - img.Width) / 2), CInt((h - img.Height) / 2))
    
        Return bitmap
    End Function
    
    In pratica ti tieni una bitmap da parte (non puoi usare quella della PictureBox perchè viene degradata) e la ruoti di un certo angolo
    
        Private m_bmp As New Bitmap("c:\\temp\img1.jpg")
        Private m_angle As Integer
    ...
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        PictureBox1.Image = Rotation(m_bmp, m_angle)
        m_angle += 10
    End Sub
    
    La picture box deve avere la property 'SizeMode' impostata a 'CenterImage'.
    Esiste poi la soluzione WPF.
  • Re: Problema nel ruotare immagini VB

    Ciao grazie, ma non devo fare un applicazione, ma un sito quindi non dispongo di una Picturebox.
    Sicneramente non ricordo dove ho trovato quel pezzo di codice che poi avrò modificato 30 volte, ma non sono arrivato ad una conclusione.

    cmq a regola sono riuscito a sfruttare il tuo codice, l unica cosa che visualizzando subito l'immagine ruotata, si degrada subito. hai qualche consiglio da darmi?
  • Re: Problema nel ruotare immagini VB

    Ma vuoi fare una applicazione tipo WebService a cui passi un' immagine e te la restituisce ruotata o vuoi ruotare un' immagine in una pagina Web o altro?.

    Comunque, lungi da me l' idea di sostituirmi ai moderatori, però non credo ci sia nulla di male a postare del codice preso da internet che poi hai modificato e sul quale stai lavorando.

    In altrenativa basta che esponi chiaramente il problema e qualcuno che ti da una mano salta fuori.

    P.S. per quanto riguarda l' immagine ruotata che si degrada puoi darmi qualche informazione in più, nel mio programma di test non vedo questo problema.
  • Re: Problema nel ruotare immagini VB

    Io devo ruotare l immagine nalla pagina web. la devo poter ruotare di un grado a destra a sinistra, ma magari invece di un grado devo ruotarla di 6/7 e devo far fare la funzione ruota 6/7 volte a quel punto l immagine essendo una fattura risulta quasi copletamente illeggibile a causa appunto di questa degradazione(usando il codice sopra)


    poi avrei un altra questione da porvi.
    io ho un immagine jpg, per fare questa rotazione devo trasformala in bitmap.

    Dim bmp_origD As New Bitmap(Server.MapPath(documento_originale))

    successivamente dovrei tornare a modificare l'immagine come se fosse un immagine normale, c'è un modo per tornare al formato originale?

    che differenza fa nel salvare
    .Save(Server.MapPath(xxx), Imaging.ImageFormat.Jpeg)

    cmq il mio problema non è stato risolto con il tuo codice, quidni a questo punto presumo che sia da riscontrarsi su altre funzioni del codice.

    oppure senza specifcare il secondo paramentro?
  • Re: Problema nel ruotare immagini VB

    Separo gli argomenti altrimenti faccio confusione:

    gnufy ha scritto:


    io devo ruotare l immagine nalla pagina web. ...
    1) Parte WEB: Hai bisogno di un codice che ruoti una immagine in una pagina Web. Hai già del codice tuo (preso da internet e che non hai ancora postato) ma ha dei problemi.

    Potresti postare il codice e poi ne parliamo, oppure se preferisci ti propongo delle soluzioni adatte al Web dato che quella che ti ho scritto era per aplicazioni Window. (deve per forza essere in VB o Javascript andrebbe bene allo stesso?)
    ----------------------------------------------------------------------------------------

    gnufy ha scritto:


    ... a quel punto l immagine essendo una fattura risulta quasi copletamente illeggibile a causa appunto di questa degradazione (usando il codice sopra)
    2) Parte Window: Hai usato il codice che ti ho scritto io in una applicazione Windows, usando un PicureBox, ma quando ruoti l' immagine di una fattura diventa illeggibile.

    Ho provato a prendere l' immagine di una fattura (del tipo solito, un pò di righe verticali e orizzontali e del testo) ho ruotato l' immagine (ho provato molti angoli, le ho fatto fare tutto il giro) ma rimane sempre bella, solo per certi angoli le linee sono un pò seghettate, ma le scritte rimangono leggibili. Ho usato un .jpg e ruoto di un grado alla volta.

    Prova a postare il codice che hai scritto e vediamo se vi sono problemi.

    Intanto di do una versione che usa una funzione sola invece che due, è sempre la stessa quindi non cambierà nulla, però è più comoda.
    
        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)
            Dim g As Graphics = Graphics.FromImage(bitmap)
            g.Transform = matrix
            g.DrawImage(img, CInt((w - img.Width) / 2), CInt((h - img.Height) / 2))
            Return bitmap
        End Function
    
    EDIT: Oppure non ho capito ed hai usato questo codice nella applicazione Web?
  • Re: Problema nel ruotare immagini VB

    Ancora una cosa, la rotazione devi sempre applicarla all' immagine originale, non all' immagine ruotata altrimenti ti esce una schifezza.
  • Re: Problema nel ruotare immagini VB

    Per farmi capire, non mi succede con tutte le immagini ma il risultato di una rotazione di 10 gradi è il seguente.




    http://imageshack.us/photo/my-images/845/aaafatoriginal.jpg/


    le scritte le ho cancellate io alla rinfusa per nn far leggere i dati

    non capisco il perche su alcune immagini mi crea tutto il bordo nero anche dove non dovrebbe. nn riesco a spigarmi il perche.

    per quanto riguarda la tua domanda se in javascript o vb è una pagina web che deve salvarmi sul server le modifiche quidni non credo che in javascript si possa fare.

    nel risponderti colgo l'occasione per ringraziarti infinitamente

    PS: l ho ruotata con il tuo codice

    mi sorge il dubbio che sbaglio a salvare l'immagine una volta ruotata

    Protected Sub ImageButtonSinistra_Click(sender As Object, e As System.Web.UI.ImageClickEventArgs) Handles ImageButtonSinistra.Click

    Dim bmp_origS As New Bitmap(Server.MapPath(documento_originale))

    Dim ImageRot_orig As Bitmap = (Rotation(bmp_origS, -10))

    bmp_origS.Dispose()
    ImageRot_orig.Save(Server.MapPath(documento_originale))
  • Re: Problema nel ruotare immagini VB

    Ho capito, prendi l' immagine, la ruoti, la salvi su file e la ricarichi nella pagina.

    In effetti, l' immagine ruotata è inutilizzabile, ti ripeto che con quelle che ho provato veniva bene, magari faccio qualche altra prova. Se magari metti una immagine non ruotata si ImagesHack provo a scaricarla e ad usarla.

    La cosa mi interessa perche pure io ho a che fare con un sito in cui ci sono immagini di documenti, in realtà non li ruoto però la problematica mi interessa.
  • Re: Problema nel ruotare immagini VB

    barba59 ha scritto:


    Ho capito, prendi l' immagine, la ruoti, la salvi su file e la ricarichi nella pagina.

    In effetti, l' immagine ruotata è inutilizzabile, ti ripeto che con quelle che ho provato veniva bene, magari faccio qualche altra prova. Se magari metti una immagine non ruotata si ImagesHack provo a scaricarla e ad usarla.

    La cosa mi interessa perche pure io ho a che fare con un sito in cui ci sono immagini di documenti, in realtà non li ruoto però la problematica mi interessa.

    ok te la linko delle dimensioni che mi da problemi con i dati sensibili oscurati

    http://imageshack.us/photo/my-images/99/fatweb.jpg


    io utilizzo in questo modo

    Protected Sub ImageButtonSinistra_Click(sender As Object, e As System.Web.UI.ImageClickEventArgs) Handles ImageButtonSinistra.Click

    Dim bmp_origS As New Bitmap(Server.MapPath(documento_originale))

    Dim ImageRot_orig As Bitmap = (Rotation(bmp_origS, -10))

    bmp_origS.Dispose()
    ImageRot_orig.Save(Server.MapPath(documento_originale))

    end sub


    dove in documento_originale ho semplicemente una stringa che mi indica l'immagine

    ho provato anche a fare ImageRot_orig.Save(Server.MapPath(documento_originale),Imaging.ImageFormat.Jpeg))

    ma il risultato non cambia. il problema che nn me lo fa con tutte le immagini con alcune funziona, non riesco a levarci le gambe
  • Re: Problema nel ruotare immagini VB

    gnufy ha scritto:


    ImageRot_orig.Save(Server.MapPath(documento_originale))
    FERMO LI! Cosi non và bene

    Non devi sovrascrivere l' immagine originale con quella ruotata, altrimenti dopo qualche rotazione diventa brutta. Ti devi memorizzare l' angolo totale e applicarlo all' immagine originale, non ruotare un' immagine già ruotata.
    Ho provato la tua immagine e si riesce a ruotare benissimo
  • Re: Problema nel ruotare immagini VB

    Ok, su quello siamo daccardo. ma non è il mio problema principale.
    a me dopo una rotazione di 10 gradi il risultato è il seguente

    http://imageshack.us/photo/my-images/845/aaafatoriginal.jpg/

    e non mi pare normale che intorno all immagine oltre il suo bordo diciamo ci sia quel nero in esubero. nn so se mi spiego ma se guardi l immagine capisci.
  • Re: Problema nel ruotare immagini VB

    Ciao gnufy
    L' esempio che ti avevo mandato era per una applicazione Windows e usava un PicureBox con lo sfondo trasparente, per cui il problema del colore di sfondo non si poneva.
    Ecco una versione che colora lo sfondo del colore che vuoi (nell' esempio ho usato il rosso), ho aggiunto solo la riga con g.FillRectangle.
    
        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)
            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
    
  • Re: Problema nel ruotare immagini VB

    Ma a te quando ruoti ti mette il nero anche a te sotto l 'immagine originale? è quello che non va bene
  • Re: Problema nel ruotare immagini VB

    Guarda, non ho fatto la prova sul web, ho provato una applicazione Windows, lì non ho problemi. Tu cosa stai provando?
Devi accedere o registrarti per scrivere nel forum
32 risposte