NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Otočení obrázku pomocí GetPixel() a SetPixel()

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Mr. W3stik
Člen
Avatar
Mr. W3stik:19.4.2015 21:18

Zdravím :) Mám úkol do školy, že mám otočit obrázek pomocí GetPixel a SetPixel, čehož jsem si původně v zadání nevšiml a udělal jsem to pomocí rotate flip type. Takže se pokouším to udělat správně. Zatím mám toto:

Color pixel;
Bitmap obr2= new Bitmap(obrPom);
for (int i=0; i<obr.Width; i++)
{
for (int j=0; j<obr.Height; j++)
{

pixel = obrPom.GetPixel(i,j);
obr2.SetPixel(o­br.Width-j,obr.Height-i,pixel);

}
}
PictureBox2.Bac­kroundImage = obr2;

Bohuážel toto mi ukazuje Error (parametr musí byt kladný a menší než šířka), pokud nahradím parametry šířky a výšky obrázku jako takového parametry šířky a výšky pictureboxu tak se obrátí jen malý kousek obrázku.
Prosím o pomoc zkušenější :)
Předem děkuji za odpovědi.

 
Odpovědět
19.4.2015 21:18
Avatar
Odpovídá na Mr. W3stik
Michael Škrášek:19.4.2015 21:41

Možná to pude takto, jen typuju :D :

for (int x = 0; x < width; x++)
{
 for (int y = 0; y < height; y++)
 {
   SetPixel(y, x, GetPixel(x, y))
 }
}
Editováno 19.4.2015 21:41
Nahoru Odpovědět
19.4.2015 21:41
"I choose a lazy person to do a hard job. Because that person will find an easy way to do it. " Bill Gates
Avatar
Odpovídá na Michael Škrášek
Štefan Pružinský:19.4.2015 21:57

Áno, ale len do ľava a pri pomere strán 1:1.
Mr. W3stik
Ak počkáš so zajtra,napíšem ti riešenie.

Nahoru Odpovědět
19.4.2015 21:57
Najefektívnejším spôsobom debuggingu je modlitba. :)
Avatar
Odpovídá na Štefan Pružinský
Michael Škrášek:19.4.2015 22:00

To je fakt no :/, ale mohl by se oříznout :D

Editováno 19.4.2015 22:01
Nahoru Odpovědět
19.4.2015 22:00
"I choose a lazy person to do a hard job. Because that person will find an easy way to do it. " Bill Gates
Avatar
Mr. W3stik
Člen
Avatar
Odpovídá na Štefan Pružinský
Mr. W3stik:20.4.2015 18:18

Štefan Pružinský Ok. Byl bych moc rád :)

Editováno 20.4.2015 18:20
 
Nahoru Odpovědět
20.4.2015 18:18
Avatar
Odpovídá na Mr. W3stik
Štefan Pružinský:20.4.2015 22:00

Ahoj,
tak tu je riešenie:
Gro (podstata) programu spočíva v tomto kóde:

if (side == "left")
{
    for (int y = 0; y < bitmapLast.Height; y++)
    {
        for (int x = 0; x < bitmapLast.Width; x++)
        {
            bitmap.SetPixel(y, bitmapLast.Width - x - 1, bitmapLast.GetPixel(x, y));
        }
    }
}

else if (side == "right")
{
    for (int y = 0; y < bitmapLast.Height; y++)
    {
        for (int x = 0; x < bitmapLast.Width; x++)
        {
            bitmap.SetPixel(bitmap.Width - y - 1, x, bitmapLast.GetPixel(x, y));
        }
    }
}

Algoritmus je veľmi jednoduchý, avšak je ťažšie naňho prísť. Ja som si to v škole kreslil, a prišiel som na zložitý spôsob, ktorý mimo iného reverzol celý obrázok, a tým pádom to bolo nepoužiteľné. Pri hľadaní chyby som prišiel na tento algoritmus.
Urobil som k tomu jednoduchú aplikáciu, môžeš si ju stiahnuť tu:https://www.dropbox.com/…WmhgUpxvhgVa?dl=0
Dôležité je, aby si algoritmus pochopil (kľudne si ho nakresli :)), a nie slepo okopíroval.

Editováno 20.4.2015 22:02
Nahoru Odpovědět
20.4.2015 22:00
Najefektívnejším spôsobom debuggingu je modlitba. :)
Avatar
Mr. W3stik
Člen
Avatar
Mr. W3stik:21.4.2015 7:27

Chápu co tam s tím obrázkem děláš, ale když kod upravím na svoji verzi tak mi to hází ten samý error jako předtím, i když se snažím ho upravit co nejmíň.

Tady je můj program https://www.dropbox.com/…bitmapou.rar?dl=0
Doopravdy už nevím co s tím momentálně jsem zmenšil šířku o 1, jelikož to hlásilo, že oarametr musí být kladný a menší než šířka, ale vykreslí se jen část obrázku..

 
Nahoru Odpovědět
21.4.2015 7:27
Avatar
Odpovídá na Mr. W3stik
Štefan Pružinský:21.4.2015 10:49

Ahoj, nevedel som, že to chceš točiť horizontálne, myslel som, že to budeš točiť left/right (tak bol urobený aj ten program). Každopádne tu funkciu si oprav:

void HorizontálněToolStripMenuItemClick(object sender, EventArgs e)
                {
                        //otoceni obrazku po ose X a jeho nasledne vykresleni v pictureboxu
                        //obrPom.RotateFlip(RotateFlipType.Rotate180FlipX);
                        //pictureBox2.BackgroundImage = obrPom;
                        Bitmap obr2= new Bitmap(obrPom);
                         for (int y = 0; y < obr2.Height; y++)
                          {
                         for (int x = 0; x < obr2.Width; x++)
                         {
                                 obr2.SetPixel(x, obr2.Height - y - 1, obrPom.GetPixel(x,y));
                         }

                   }
                        pictureBox2.BackgroundImage = obr2;
                }

Takto to bude fungovať. Keď dokončíš aj vertikálne, ozvi sa:).

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
21.4.2015 10:49
Najefektívnejším spôsobom debuggingu je modlitba. :)
Avatar
Mr. W3stik
Člen
Avatar
Mr. W3stik:21.4.2015 13:00

Tak jsem to dodělal, největší problém byl, že jsem tam dával full HD obrázek, který se do pictureboxu nevešel a musel jsem tím pádem brát rozměry pictureboxu. Takže to zobrazuje jen kousek obrázku ale otáčí ho to správně :)
Zde přikládám hotový program https://www.dropbox.com/…bitmapou.rar?dl=0
Moc děkuji za pomoc :)

 
Nahoru Odpovědět
21.4.2015 13:00
Avatar
Štefan Pružinský:21.4.2015 13:35

Skúšal som to, ale s rozmermi pictureboxu to hodí chybu. Radšej si tu bitmapu po prevrátení zmenši. Napr. takto:

Size size = new Size(pictureBox2.Width, pictureBox2.Height);
Bitmap bmp = new Bitmap(obr2, size);

Inak, ak si bol spokojný z riešením odfajfkní riešenie:).

Nahoru Odpovědět
21.4.2015 13:35
Najefektívnejším spôsobom debuggingu je modlitba. :)
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 10 zpráv z 10.