Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

PictureBox Image size After scale?

Îåêßíçóå áðü ôï ìÝëïò Johnnyxp64. Τελευταία δημοσίευση από το μέλος Johnnyxp64 στις 09-06-2010, 17:49. Υπάρχουν 11 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  02-06-2010, 17:52 58932

    PictureBox Image size After scale?

    καλησπερα σε ολους,

    εχω ενα ερωτημα (μαλλον απλο) που προσπαθησα να αναζητησω λυση αλλα δεν βρηκα κατι.

    εχω ενα picturebox(σταθερν διαστασεων) και κανω Load ενα image σε αυτο, ομως δεν γνωριζω τι μεγεθος θα ειναι οι εικονα και θελω να κρατα τις αναλογιες τις, ρυθμιζω το Picturebox να κανε scale=ZOOM ετσι αν ειναι μικροτερη η εικονα την μεγαλωνει ή την μικρενα αντιστροφα.

    Το ερωτημα ειναι θελω να παρω τις διαστασεις που πηρε η εικονα μεσα στο Picturebox after scale αλλα το Picturebox.image.height etc εξακολουθουν να μου επιστρεφουν τις πραγματικες αρχικες διαστασεις και οχι αυτε που βλεπω scaled!!! κοιταξα και το property physical dimension τιποτα!

    πρεπει να βρω ενα τροπο να υπολογιζω ΤΙ διαστασεις εχει παρει πλεον η εικονα μου μετα το scale μεσα στο picturebox!

    καμια ειδεα?

    vb.net code

    ευχαριστω πολυ

    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  02-06-2010, 19:51 58937 σε απάντηση της 58932

    Απ: PictureBox Image size After scale?

    Ορίστε το πως η κλάση PictureBox υπολογίζει το Rectangle στο οποίο θα σχεδιάσει την εικόνα σου στην περίπτωση που το SizeMode είναι στην τιμή Zoom,είναι πολύ απλό να καταλάβεις το πως θα πορευθείς με βάση αυτήν την πληροφορία:

        Dim size As Size = Me.image.Size
                    Dim num As Single = Math.Min(CSng((CSng(MyBase.ClientRectangle.Width) / CSng(size.Width))), CSng((CSng(MyBase.ClientRectangle.Height) / CSng(size.Height))))
                    rectangle.Width = CInt((size.Width * num))
                    rectangle.Height = CInt((size.Height * num))
                    rectangle.X = ((MyBase.ClientRectangle.Width - rectangle.Width) / 2)
                    rectangle.Y = ((MyBase.ClientRectangle.Height - rectangle.Height) / 2)
     

    Όπου rectangle είναι το ClientRectangle αφού αφαιρέσεις το Padding από αυτό.

  •  03-06-2010, 11:26 58943 σε απάντηση της 58937

    Απ: PictureBox Image size After scale?

    ειλικρινά με μπέρδεψες περισσότερο....Tongue Tied
    γιατι πρεπει να ξερω το πως το κανει? αν εχεις ετοιμη μια λυση να παρω τις "μετα ζοομ" διαστάσεις θα το εκτιμούσα.

    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  03-06-2010, 12:46 58947 σε απάντηση της 58943

    Απ: PictureBox Image size After scale?

    Johny, ο darklynx σου απάντησε αρκετά καλά με κώδικα. Το picturebox υπολογίζει τη σχέση μεταξύ των διαστάσεων της εικόνας και του picturebox και επιλέγει τη μικρότερη.  Μετά πολλαπλασιάζει τις διαστάσεις της εικόνας με αυτή τη σχέση. Αν κάνεις κι εσύ το ίδιο στο δικό σου κώδικα θα έχεις ο ίδιο αποτέλεσμα.

    Δεν έχει νόημα να προσπαθείς να πάρεις τις διαστάσεις του Image γιατί πολύ απλά αυτό δεν αλλάζει μέγεθος. Απλά το picturebox το παρουσιάζει υπό κλίμακα. Επίσης δεν έχει νόημα να πάρεις τις διαστάσεις του PictureBox, γιατί ούτε αυτό αλλάζει.

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  03-06-2010, 13:57 58948 σε απάντηση της 58947

    Απ: PictureBox Image size After scale?

    αρα δεν γινεται και πρεπει να κανω εγω το resize και να παρω τα νουμερα? αυτο λες αν καταλαβαινω σωστά,
     και απλα ο παραπανω κωδικα θα με βοηθουσε στο να κανω κι εγω το resize και να μην βασιστω στο Picturebox γιοτι οπως λες δεν αλλαζει τελικα το μεγεθος αλλα το διχνει σε αναλογια.....?


    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  03-06-2010, 14:05 58949 σε απάντηση της 58948

    Απ: PictureBox Image size After scale?

    Όχι. Ξαναδιάβασε τί σου λέμε και οι δύο. Ο κώδικας αυτός σου δείχνει πως ΥΠΟΛΟΓΙΖΕΤΑΙ το μέγεθος. Δεν σου είπε κανείς να κάνεις ο ίδιος resize.
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  03-06-2010, 14:26 58950 σε απάντηση της 58949

    Απ: PictureBox Image size After scale?

    hmmmm θα το δοκιμασω, οκ παιδια ευχαριστω.
    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  09-06-2010, 11:22 59053 σε απάντηση της 58937

    Απ: PictureBox Image size After scale?

    για οποιον ενδιαφερθει ποτε για κατι τετιο στο μελλον να η τελικη function Που εφτιαξα, για δικους μου λογους το return ηθελα να ειναι σε string της μορφης (Χ,Υ) αλλα γενκα δουλευει σωστα.
    ευχαριστω ολους οσους βοηθησαν να καταλαβω τι παιζει με το Picturebox.
    (back to the community λοιπον)

    Private Function GetActualImageZoomSize(ByVal pBox As PictureBox) As String
            Dim sizeStr As String = Nothing
            Dim img As Image = pBox.Image
            Dim zoomImageHeight As Integer = 0
            Dim zoomImageWidth As Integer = 0
            Try
                If img IsNot Nothing Then
                    ' We use trial in error here to save many lines of code
    
                    ' Use client rectangle width as reference
                    zoomImageWidth = pBox.ClientRectangle.Width
                    zoomImageHeight = (zoomImageWidth * img.Height) / img.Width
    
                    If zoomImageHeight > pBox.ClientRectangle.Height Then
                        ' Use client rectangle height as reference
                        zoomImageHeight = pBox.ClientRectangle.Height
                        zoomImageWidth = (zoomImageHeight * img.Width) / img.Height
    
                        If zoomImageWidth > pBox.ClientRectangle.Width Then
                            ' I'm not sure if this will happen. But just in case...
                            sizeStr = Nothing
                        End If
                    End If
                    sizeStr = String.Format("({0},{1})", zoomImageWidth.ToString(), zoomImageHeight.ToString())
                End If
            Catch
                sizeStr = Nothing
            End Try
            Return sizeStr
    End Function



    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  09-06-2010, 11:39 59055 σε απάντηση της 59053

    Απ: PictureBox Image size After scale?

    Δεν θα έλεγα ότι αυτός ο κώδικας είναι σωστός ή απλός, ούτε θα τον πρότεινα ως λύση. Καταρχήν, το catch που τρώει τα λάθη είναι ... εγκληματικό. Αν κάτι δεν σου δουλεύει, βρες το και διόρθωσε το, μην το καταπίνεις. Άσε που ένα exception είναι εκατοντάδες φορές πιο αργό από ένα If.

    Επίσης, το "just in case" σημαίνει ότι δεν έχεις καταλάβει πως δουλεύει ο κώδικας που έγραψες. Τέλος, μπλέκεις τον υπολογισμό του zoom με τον υπολογισμό των διαστάσεων. Είναι πολύ κακή συνήθεια να μπλέκεις διαφορετικά πράγματα καθώς οδηγεί σε δυσανάγνωστο κώδικα και πιθανά σφάλματα. Εξάλλου, το γεγονός και μόνο ότι έχεις βάλει τα "just in case" και το "Catch το σύμπαν" σημαίνουν ότι συνάντησες προβλήματα τα οποία δεν έλυσες ακόμα.

     


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  09-06-2010, 12:05 59058 σε απάντηση της 59055

    Απ: PictureBox Image size After scale?

    οταν βρω χρονο θα επιστρεψω σε αυτη για βελτιωσεις γνωριζω καποια "αρνητικα" που εχει αλλα για τωρα την δουλεια μου την κανω, δεν ειναι για κατι ετσι κι αλλιος εππαγγελματικο αλλα οπως και να χει ευχαριστω για τις παρατηρησεις.
    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  09-06-2010, 15:38 59063 σε απάντηση της 59058

    Απ: PictureBox Image size After scale?

    Οφείλω να επισημάνω δύο σοβαρά λάθη που έχει η δική σου υλοποίηση:

    α)δεν λαμβάνεις καθόλου υπόψην σου το padding,το οποίο όμως λαμβάνει υπόψην του το PictureBox όταν επιχειρεί να υπολογίσει το Rectangle στο οποίο θα σχεδιάσει την εικόνα.Άρα αν βάλεις padding οτιδήποτε άλλο εκτός από μηδέν θα σου βρει λάθος τιμές.Το σοβαρότερο λάθος όμως είναι το

    β)η συνθήκη που υπολογίζει με βάση ποια διάσταση του picturebox πρέπει να γίνει το scaling είναι λάθος.

    Εσύ την ορίζεις ως:

                    If zoomImageHeight > pBox.ClientRectangle.Height Then
                        ' Use client rectangle height as reference

    Το PictureBox όμως δεν κάνει το ίδιο.Αν αναπτύξεις την Math.Min και αποσπάσεις το αντίστοιχο κομμάτι κώδικα με το δικό σου:

    If (pBox.ClientRectangle.Width / img.Width) > (pBox.ClientRectangle.Height / img.Height) Then 
         ' Use client rectangle height as reference 

    Νομίζω ότι η διαφορά είναι εμφανής και ο μόνος λόγος που δεν το έχεις διαπιστώσει ακόμα (αλήθεια,πως γνωρίζεις ότι οι τιμές που παίρνεις είναι σωστές;) είναι θέμα τύχης περισσότερο.

    EDIT:Δεν έκανα τα μαθηματικά μου και την πάτησα.Κράτα μόνο το α) λοιπόν και συγγνώμη για την αβλεψία μου.

  •  09-06-2010, 17:49 59064 σε απάντηση της 59063

    Απ: PictureBox Image size After scale?

    σε ευχαριστώ για την παρατήρηση αλλα εχω παντα το pading στο 0. οταν θα αποφασισω να το τελειοποιήσω αργοτερα, φυσικα θα το υπολογιζω και αυτο μετα.

    tnx again.

    υγ οσο για την διασταυρωση την κανω πολυ απλα και αστεια print scrin και σε paint .net περνω την εικονα με selection και βλεπω τις διαστασεις εκει με αυτες που επιστρεφει η function αν ειναι οκ. και ειναι :) μπορει να ειναι λιγο αστειος ο τροπος η μπακαλικος για καποιους αλλα εχεις σωστα αποτελεσματα what i see is what i get! Stick out tongue

    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems