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 ClassHyvä, 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.