Avatar
Mr. W3stik
Člen
Avatar
Mr. W3stik:

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  +1 19.4.2015 21:18
Avatar
Odpovídá na Mr. W3stik
Michael Škrášek:

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
Proč to dělat složitě, když to jde jednoduše.
Avatar
Odpovídá na Michael Škrášek
Štefan Pružinský:

Á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:

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
Proč to dělat složitě, když to jde jednoduše.
Avatar
Mr. W3stik
Člen
Avatar
Odpovídá na Štefan Pružinský
Mr. W3stik:

Š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ý:

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:

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ý:

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í
+1 bodů
Ř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:

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ý:

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.