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...
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ä.
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ä.
Mahdollisimman portaaromasti. Sehän onnistuu vain kääntämällä kuvaa aina vaan vähän, kunnes sitä on käännetty 90 astetta.
Niin, pienissä portaissa. Sulavimmin kääntynee jos porras on sen verran mitä kuvan virkistystaajuuden aikana on tarpeen kääntää.
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.)
Kuvien tekeminen on kyllä erittäin työlästä.
ErroR++ kirjoitti:
Kuvien tekeminen on kyllä erittäin työlästä.
Mitä, jos käyttäisit FreeImage kirjastoa tuohon kuvien kääntelyyn?
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.
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
Hyvä, meinaan toi mun systeemi mitä mä virittelin, ei paljoa mitään tehnyt.
Toi jäi jumiin!!!
Väitti jotakin Use The "New" keyword...
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")
En ladannut kyllä mitään kuvaa siihen. Johtu varmaan siitä D:
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
..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...
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)
Enpä huomannut otsikossa tuota ".net" sanaa.
Don't worry, be happy.
Kuvan pyöritys tuli taisi selväksi.
Kattokaas mitä saatte kun sorkitte vähän noita laskutoimituksia!!!
Kolmiulotteista pyörimistä...!
Onko sulla 3d-lasit käytössä, vai?
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)
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ä. :)
AimoKulaus kirjoitti:
(Mikään pikseli pikseliltä tehty For-Next silmukka ei ole tarpeeksi nopea)
Mä huomasin kyllä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.