Diskuze: Rotace obrázku

C# .NET .NET (C# a Visual Basic) Rotace obrázku American English version English version

Avatar
mbeloch97
Člen
Avatar
mbeloch97:

Zdravím, potřeboval bych pomoc s otáčením obrázku. Když zmáčknu pravou šipku, tak se obrázek otočí o trochu doprava (záleží, jak dlouho šipku držím). Levá šipka -> doleva. Už jsem si k tomu něco hledal, ale moc to nechápu - např zde: http://www.codeproject.com/…ox-Rotations
Abych upřesnil, obrázek je hráč, který se v závislosti na stisku kláves otáčí. Děkuji moc za rady.

 
Odpovědět 23.3.2015 0:55
Avatar
rwn
Člen
Avatar
Odpovídá na mbeloch97
rwn:

A s čím tam máš konkrétně problém? Oni tam mají napsanou metodu RotateImage, která bere parametry: (jaký obrázek chtějí rotovat), (bod, kolem kterého chtějí rotovat) a (o kolik stupňů). V podstatě jediné co už jen potřebuješ je, si udělat události na zmáčknutí tlačítka a podle toho volat tuto jejich metodu s daným úhlem. Jo a taky by bylo fajn si pamatovat aktuální úhel od kterého budeš přidávat nebo odečítat úhel při zmáčknutí. :)
Mohlo by to vypadat nějak takhle (je to v podstatě to jejich + volání té metody v závisloti na stisku + dvě proměnné)

private Image image;
private int actualAngel;

public Form1()
{
    InitializeComponent();
    actualAngel = 0;
    image = new Bitmap(@"C:\\nejakyObrazek.png");
    pictureBox1.Image = (Bitmap)image.Clone();
}

public Bitmap RotateImage(Image image, PointF offset, float angle)
{
    if (image == null)
        throw new ArgumentNullException("image");

    Bitmap rotatedBmp = new Bitmap(image.Width, image.Height);
    rotatedBmp.SetResolution(image.HorizontalResolution, image.VerticalResolution);
    Graphics g = Graphics.FromImage(rotatedBmp);
    g.TranslateTransform(offset.X, offset.Y);
    g.RotateTransform(angle);
    g.TranslateTransform(-offset.X, -offset.Y);
    g.DrawImage(image, new PointF(0, 0));
    return rotatedBmp;
}

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    // rotace jsou o 10° kolem vlastního středu obrázku
    if(e.KeyData == Keys.Left)
        pictureBox1.Image = RotateImage(image, new Point(image.Width / 2, image.Height / 2), actualAngel -= 10);

    if (e.KeyData == Keys.Right)
        pictureBox1.Image = RotateImage(image, new Point(image.Width / 2, image.Height / 2), actualAngel += 10);
}

Ten druhý parametr při rotaci jsem dal na polovinu výšky a šířky obrázku, aby se to rotovalo kolem středu obrázku. Jinak teda nejsem si jist jestli je WF nejlepší volba na hru, ikdyž dost záleží co všechno v ní chceš mít. :)

Akceptované řešení
+20 Zkušeností
Řešení problému
Nahoru Odpovědět 23.3.2015 3:17
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
vodslon
Člen
Avatar
Odpovídá na mbeloch97
vodslon:

Hezký den,

Takovej off topic trochu, možná jeslti máš hru kde máš panáčka co bude pobíhat a něco dělat, vůbec neřeš otáčení obrázku jako takového. Koukni na všechny staré hry, je ten panáček "statickej" že prostě kouká pořád na stejnou stranu a hejbe se ta ikona s ním, chci říct, at si v tom neuděláš zbytečnej zmatek a kod navíc :-)

 
Nahoru Odpovědět 23.3.2015 10:25
Avatar
mbeloch97
Člen
Avatar
Odpovídá na rwn
mbeloch97:

Děkuju moc, už jsem si to docela ujasnil :)

 
Nahoru Odpovědět 23.3.2015 16:53
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.