Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: Kuvan kääntö portaattomasti (90 astetta) .net

Sivun loppuun

ErroR++ [23.06.2011 18:08:11]

#

Juu mites vois saada kuvan kääntymään pictureboxissa??? Boxin nimi on Picture1. En sattumoisin löytänyt mitään metodia, joka ehkä voisi osata sen. Haullakaan en selvinnyt mihinkään...

jtha [23.06.2011 22:47:18]

#

Ei tule muuta meleen kuin tallettaa kuva toiseen boxiin, tutkia 'pikseli' kerrallaan (Väri=ToinenBoxi.Point(x,y)), laskea uudet koordinaatit Picture1:seen ja siirtää(Picture1.Pset(x2,y2)=Väri) sinne.

En ole testannut - varmasti hidas menetelmä.

Grez [24.06.2011 03:00:38]

#

Itse tutkiskelisin varmaankin jotain joka osaa hyödyntää näytönohjainta hommaan, eli OpenGL tai DirectX.

Portaattomasti on mahdotonta kääntää, mutta varmaankin riittää jos kääntyminen on pehmeän näköistä.

ErroR++ [24.06.2011 09:02:58]

#

Mahdollisimman portaaromasti. Sehän onnistuu vain kääntämällä kuvaa aina vaan vähän, kunnes sitä on käännetty 90 astetta.

Grez [24.06.2011 12:06:05]

#

Niin, pienissä portaissa. Sulavimmin kääntynee jos porras on sen verran mitä kuvan virkistystaajuuden aikana on tarpeen kääntää.

jtha [26.06.2011 10:28:40]

#

Jos on kyseessä pieni kuva, niin voinet tallettaa kuvan moneksi kuvaksi etukäteen ja näyttää ne peräkkäin?

(Pikseli kerrallaan jos koetat, niin pitää laskea kuitenkin siten, että käydään läpi käännetyn kuvan pikselit ja lasketaan mikä piste siihen haetaan alkuperäisestä kuvasta.)

ErroR++ [26.06.2011 15:57:18]

#

Kuvien tekeminen on kyllä erittäin työlästä.

jalski [26.06.2011 16:07:42]

#

ErroR++ kirjoitti:

Kuvien tekeminen on kyllä erittäin työlästä.

Mitä, jos käyttäisit FreeImage kirjastoa tuohon kuvien kääntelyyn?

ErroR++ [26.06.2011 17:45:01]

#

Function käännä(ByVal Boxi As PictureBox, ByVal Kuva As Image, ByVal kerrat
As Integer) As Boolean

Boxi.Clear() 'Clearataan Boxi
For n As Integer = 0 To kerrat 'Pieni luuppi
Dim x, y As Integer
Dim Väri As System.Drawning.Color
x = n
Väri = Image.Point(x,y) 'Luetaan
Boxi.Pset(x,y) 'Asetetaan
Next 'Seuraava

Tuo kääntää (kai?) Boxiin kuvan ensimmäisen x -akselin.

AimoKulaus [26.06.2011 18:24:28]

#

Tein pikaisesti kopioi-liitä systeemillä ohjelman, jossa on esimerkki kuvan pyörityksestä. Ohjelmana on VB2008.

Formille:
picturebox picSiirtokuva. Tähän tulee se valmis kuva
picturebox picKäsiteltäväkuva, johon lataat halutun alkuperäisen jpg-kuvan.
tekstiboksi txtKulma, johon laitat haluamasi kulman, esim 75
button btnPyöritä

Ja sitten vaan oheinen koodi

(Varsinainen kuvan kierto tehdään aliohjelmassa Asetakuva. Kulma-arvot ovat omituisesti niin, että 0 on pystysuorassa, ja kuva kiertyy siitä oikealle. Tämä johtuu alkuperäisen ohjelman vaatimuksista.)

Public Class Form1

    Public ValokuvanKokoX, ValokuvanKokoY As Single

    Public p1x, p1y As Single
    Public p2x, p2y As Single
    Public p3x, p3y As Single
    Public p4x, p4y As Single
    Public p5x, p5y As Single


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        picSiirtokuva.Image = New Bitmap(picSiirtokuva.Width, picSiirtokuva.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb)

    End Sub


    Public Sub Pyöritä(ByVal _degrees As Single)

        Dim kokovino As Single
        Dim keskix, keskiy As Single
        Dim _kulma As Single
        Dim _kul1, _kul2, _kul3, _kul4 As Single

        _kulma = _degrees * Math.PI / 180

        kokovino = picSiirtokuva.Width / 2
        keskix = picSiirtokuva.Width / 2
        keskiy = picSiirtokuva.Height / 2

        _kul2 = -Math.Atan(picKäsiteltäväkuva.Height / picKäsiteltäväkuva.Width)
        _kul1 = (-Math.PI - _kul2)
        _kul3 = -_kul2
        _kul4 = (-Math.PI + _kul2)

        p1x = keskix + Math.Sin(_kul1 + _kulma) * kokovino
        p1y = keskiy - Math.Cos(_kul1 + _kulma) * kokovino
        p2x = keskix + Math.Sin(_kul2 + _kulma) * kokovino
        p2y = keskiy - Math.Cos(_kul2 + _kulma) * kokovino

        p3x = keskix + Math.Sin(_kul3 + _kulma) * kokovino
        p3y = keskiy - Math.Cos(_kul3 + _kulma) * kokovino

        p4x = keskix + Math.Sin(_kul4 + _kulma) * kokovino
        p4y = keskiy - Math.Cos(_kul4 + _kulma) * kokovino
        p5x = keskix
        p5y = keskiy

        ValokuvanKokoX = Math.Sqrt((p1x - p2x) ^ 2 + (p1y - p2y) ^ 2)
        ValokuvanKokoY = Math.Sqrt((p1x - p4x) ^ 2 + (p1y - p4y) ^ 2)

        Asetakuva(p1x, p1y, p2x, p2y, p4x, p4y)


    End Sub

    Private Sub Asetakuva(ByVal _p1x As Integer, ByVal _p1y As Integer, ByVal _p2x As Integer, ByVal _p2y As Integer, ByVal _p3x As Integer, ByVal _p3y As Integer)

        Dim destinationPoints As Point() = {New Point(_p1x, _p1y), New Point(_p2x, _p2y), New Point(_p3x, _p3y)}

        Dim g As Graphics = Graphics.FromImage(picSiirtokuva.Image)
        Dim image = New Bitmap(picKäsiteltäväkuva.Image)

        g.Clear(System.Drawing.Color.FromArgb(0, 255, 255, 255))
        g.DrawImage(image, destinationPoints)

        picSiirtokuva.Refresh()

    End Sub

    Private Sub btnPyöritä_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPyöritä.Click

        'Pyöritä(Val(txtKulma.Text))

        For i = 0 To Val(txtKulma.Text)
            Pyöritä(i)
        Next

    End Sub


End Class

ErroR++ [26.06.2011 18:33:35]

#

Hyvä, meinaan toi mun systeemi mitä mä virittelin, ei paljoa mitään tehnyt.

Toi jäi jumiin!!!


Väitti jotakin Use The "New" keyword...

AimoKulaus [27.06.2011 08:22:05]

#

Millä rivillä tuli tuo virheilmoitus?

Oletko varmasti ladannut jpg-valokuvan tuohon pictureboksiin picKäsiteltäväkuva?

Sen voi tehdä jo suunnitteluvaiheessa Properties kohdassa tai ohjelmallisesti laittamalla oheisenkaltainen rivi Form1_Loadiin. Kuvalle tietenkin oikea polku ja nimi.

picKäsiteltäväkuva.Image = System.Drawing.Image.FromFile("C:\Temp\SDC12549.jpg")

ErroR++ [27.06.2011 15:17:03]

#

En ladannut kyllä mitään kuvaa siihen. Johtu varmaan siitä D:

ErroR++ [27.06.2011 16:44:49]

#

Mä tein WebBrowserin, jolla mä kirjotin tän!!!
aika hyvä

vähän nopeempi kun internet explorer, mutta saman laatuista kuvaa tulee näytölle

jtha [27.06.2011 19:55:24]

#

..muuten kun esittelette muuttujat niin esim. "Public p1x, p1y As Single" ei määrittele p1x:lle muuttujan tyyppiä. Jokaiselle pitää kirjoittaa erikseen - (ainakin VB6 tämän vaatii.)

Toimii kyllä, mutta jos kerran esittelee niin...

Grez [27.06.2011 20:05:38]

#

No mutta tämä onkin VB.Net jossa se toimii toisin.

Ne VB6:t vois kyllä jo tunkea sinne jonnekin mihin päivä ei paista.

VB.Netissä voi myös alustaa suoraan määritellessä

Dim jotain as Double = 7

Ja alustettaessa tietyn tyyppisellä ei tarvitse määrittää tyyppiä ollenkaan:

Dim Jotain = 7
'Sama kuin: Dim Jotain As Integer = 7

Tai selkeämpi tapaus:

Dim Aika = New DateTime(12093092)

jtha [28.06.2011 21:04:24]

#

Enpä huomannut otsikossa tuota ".net" sanaa.

Don't worry, be happy.

ErroR++ [30.06.2011 11:17:06]

#

linkki WebBrowseriin

Kuvan pyöritys tuli taisi selväksi.

ErroR++ [07.07.2011 18:20:08]

#

Kattokaas mitä saatte kun sorkitte vähän noita laskutoimituksia!!!

Kolmiulotteista pyörimistä...!

Grez [07.07.2011 21:22:27]

#

Onko sulla 3d-lasit käytössä, vai?

AimoKulaus [10.07.2011 09:20:51]

#

lainaus:

Kattokaas mitä saatte kun sorkitte vähän noita laskutoimituksia!!!
Kolmiulotteista pyörimistä...!

Tuolla saa siis tehtyä myös vinoneliöitä. Tässähän ilmoitetaan vain kolme pistettä.

Mutta kuka keksii yhtä nopean menetelmän jolla kuvaa saa väänneltyä vaikka minkäkokoisiksi nelikulmioiksi, siis vain ilmoittamalla neljä mielivaltaista kulmapistettä?
(Mikään pikseli pikseliltä tehty For-Next silmukka ei ole tarpeeksi nopea)

Metabolix [10.07.2011 10:14:10]

#

AimoKulaus kirjoitti:

Mutta kuka keksii yhtä nopean menetelmän jolla kuvaa saa väänneltyä vaikka minkäkokoisiksi nelikulmioiksi,

Kohtuullisen nopeasti kuvan voi piirtää pikselirivi kerrallaan, mutta uusi kuva ei ole silloin nätisti pehmennetty kuin toisen akselinsa suunnassa, ja jos kuva vaatii venytyksen lisäksi kääntöä, lopputulos voi olla aika kauhea (reikäinen ja epätarkka). Pelkkä venytys toisen akselin pysyessä suorana tuottaa ihan kohtuullista jälkeä. :)

ErroR++ [11.07.2011 18:27:14]

#

AimoKulaus kirjoitti:

(Mikään pikseli pikseliltä tehty For-Next silmukka ei ole tarpeeksi nopea)

Mä huomasin kyllä.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta