Diskuze: Vyříznutí a zvětšení vyříznuté části z obrázku

C# .NET .NET (C# a Visual Basic) Vyříznutí a zvětšení vyříznuté části z obrázku American English version English version

Avatar
Mr. W3stik
Člen
Avatar
Mr. W3stik:

Zdravím lidi. Mám takový problém. Náš učitel na programování na střední škole není moc chytrý a programy bere od cizích, takže není schopen to sám vysvětlit a dává nám programy pouze opsat. Bohužel občas to někdo nestihne a pokud chce aby to učitel vrátil tak ho seřve. Toto je můj případ. Jelikož tu látku nechápu protože nám není vysvětlena obracím se na vás. Máme za úkol vyříznout kus obrázku (klasický výběr jako např. na ploše windows) a tu vyřízlou část zvětšit (každý pixel tam bude 4x). Vůbec nevím co s tím. Jediné co jsem vyřešil byl samotný výběr. Přikládám část kodu. Doufám že mi dokážete pomoci. Děkuji :)

void PictureBox1MouseMove(object sender, MouseEventArgs e)
                {
                        Bitmap Obr2 = new Bitmap(ObrPom);
                        if(Kreslit == true){
                                pictureBox1.Image = Obr2;
                                Graphics gr = Graphics.FromImage(Obr2);
                                Pen Pero = new Pen(Color.Red);
                                Pero.Width = 1;
                                gr.DrawLine(Pero,ZacX,ZacY,e.X,ZacY);
                                gr.DrawLine(Pero,e.X,ZacY,e.X,e.Y);
                                gr.DrawLine(Pero,ZacX,e.Y,e.X,e.Y);
                                gr.DrawLine(Pero,ZacX,ZacY,ZacX,e.Y);
                                gr.Dispose();
                                }
                        }

                void ZvětšitToolStripMenuItemClick(object sender, EventArgs e)
                {
                        Color Pixel;
                        Bitmap Obr2 = new Bitmap(ObrPom);
                        for(int x = ZacX; x < KonecVyrezuX; x++){
                                for(int y = ZacY; y < KonecVyrezuY;y++){
                                        Pixel = ObrPom.GetPixel(x,y);
                                        Obr2.SetPixel(2*x,2*y,Pixel);
                                        Obr2.SetPixel(2*x+1,2*y,Pixel);
                                        Obr2.SetPixel(2*x,2*y+1,Pixel);
                                        Obr2.SetPixel(2*x+1,2*y+1,Pixel);
                                }
                        }
                        pictureBox2.Image = Obr2;
                }
Editováno 10.5.2015 18:26
 
Odpovědět 10.5.2015 18:25
Avatar
Nahoru Odpovědět 10.5.2015 18:46
Proč to dělat složitě, když to jde jednoduše.
Avatar
Mr. W3stik
Člen
Avatar
Odpovídá na Michael Škrášek
Mr. W3stik:

Ano musí to být pomocí cyklu :/ a vykreslovat pixel po pixelu.

 
Nahoru Odpovědět 10.5.2015 19:05
Avatar
Odpovídá na Mr. W3stik
Michael Škrášek:

Co takhle?

private void Form1_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.DrawImage(image, 0, 0);
    e.Graphics.DrawImage(BiggerSize(image, 2, 2), 100, 0);
}

private Bitmap BiggerSize(Bitmap img, int w, int h)
{
    Bitmap bmp = new Bitmap(img.Width * w, img.Height * h);

    Graphics gr = Graphics.FromImage(bmp);

    for (int x = 0; x < img.Width; x++)
    {
        for (int y = 0; y < img.Height; y++)
        {
            Color pixel = img.GetPixel(x, y);
            gr.FillRectangle(new SolidBrush(pixel), x * w, y * h, w, h);
        }
    }

    return bmp;
}


private Color RandomColor()
{
    Random random = new Random(DateTime.Now.Millisecond);
    byte r = (byte)random.Next(255); Thread.Sleep(1);
    byte g = (byte)random.Next(255); Thread.Sleep(1);
    byte b = (byte)random.Next(255);
    return Color.FromArgb(r, g, b);
}

public Bitmap image
{
    get {
        Bitmap bmp = new Bitmap(100, 100);
        Graphics gr = Graphics.FromImage(bmp);
        for (int x = 0; x < 10; x++)
        {
            for (int y = 0; y < 10; y++)
            {
                gr.FillRectangle(new SolidBrush(RandomColor()), x * 10, y * 10, 10, 10);
            }
        }
        return bmp;
    }
}
Editováno 10.5.2015 19:35
Nahoru Odpovědět  +1 10.5.2015 19:34
Proč to dělat složitě, když to jde jednoduše.
Avatar
Odpovídá na Mr. W3stik
Michael Škrášek:

To w a h znamená kolikrát se má zvětšit šířka a výška obrázku

Nahoru Odpovědět 10.5.2015 19:37
Proč to dělat složitě, když to jde jednoduše.
Avatar
Odpovídá na Mr. W3stik
Michael Škrášek:

Chybka :D

private void Form1_Paint(object sender, PaintEventArgs e)
{
    Bitmap bmp = image;
    e.Graphics.DrawImage(bmp, 0, 0);
    e.Graphics.DrawImage(BigerSize(bmp, 2, 2), 100, 0);
}

private Bitmap BiggerSize(Bitmap img, int w, int h)
{
    //hlavní kód
    Bitmap bmp = new Bitmap(img.Width * w, img.Height * h);

    Graphics gr = Graphics.FromImage(bmp);

    for (int x = 0; x < img.Width; x++)
    {
        for (int y = 0; y < img.Height; y++)
        {
            Color pixel = img.GetPixel(x, y);
            gr.FillRectangle(new SolidBrush(pixel), x * w, y * h, w, h);
        }
    }

    return bmp;
}


private Color RandomColor()
{
    Random random = new Random(DateTime.Now.Millisecond);
    byte r = (byte)random.Next(255); Thread.Sleep(1);
    byte g = (byte)random.Next(255); Thread.Sleep(1);
    byte b = (byte)random.Next(255);
    return Color.FromArgb(r, g, b);
}

private Bitmap image
{
    get {
        Bitmap bmp = new Bitmap(100, 100);
        Graphics gr = Graphics.FromImage(bmp);
        for (int x = 0; x < 10; x++)
        {
            for (int y = 0; y < 10; y++)
            {
                gr.FillRectangle(new SolidBrush(RandomColor()), x * 10, y * 10, 10, 10);
            }
        }
        return bmp;
    }
}
Nahoru Odpovědět 10.5.2015 19:43
Proč to dělat složitě, když to jde jednoduše.
Avatar
Mr. W3stik
Člen
Avatar
Odpovídá na Michael Škrášek
Mr. W3stik:

Od té metody Color moc nechápu proč jsi to tam dělal :/ . Mohl by jsi prosím zkusit pomocí údajů, které jsou v mém kodu v události MouseMove a zkusit pouze vykreslit tu vyřízlou část zbytek bych už dokázal udělat podle tvého kodu co jsi teď posílal :)

 
Nahoru Odpovědět 10.5.2015 20:24
Avatar
Odpovídá na Mr. W3stik
Michael Škrášek:

ještě to ale potřebuje ošetřit ;)

private Point from = new Point(0, 0);
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    from = new Point(e.X, e.Y);
}

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
    int fx, fy, sx, sy;

    if (e.X > from.X)
    {
        sx = e.X - from.X;
        fx = from.X;
    }
    else
    {
        fx = from.X - (from.X - e.X);
        sx = (from.X - e.X);

    }

    if (e.Y > from.Y)
    {
        sy = e.Y - from.Y;
        fy = from.Y;
    }
    else
    {
        fy = from.Y - (from.Y - e.Y);
        sy = (from.Y - e.Y);
    }

    Bitmap CutImage = Cut((Bitmap)pictureBox1.Image, new Point(fx, fy), new Size(sx, sy));
    pictureBox1.Image = CutImage;
}

private Bitmap Cut(Bitmap image, Point from, Size to)
{
    //oříznutí obrázku
    Bitmap bmp = new Bitmap(to.Width, to.Height);
    for (int x = 0; x < to.Width; x++)
    {
        for (int y = 0; y < to.Height; y++)
        {
            Color pixel = image.GetPixel(x + from.X, y + from.Y);
            bmp.SetPixel(x, y, pixel);
        }
    }

    return bmp;
}
Editováno 10.5.2015 21:18
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 10.5.2015 21:18
Proč to dělat složitě, když to jde jednoduše.
Avatar
vodslon
Člen
Avatar
Odpovídá na Mr. W3stik
vodslon:

Stačí odpověd kolegy nebo to chceš ještě jednodušeji? :)

 
Nahoru Odpovědět  +1 13.5.2015 16:16
Avatar
Mr. W3stik
Člen
Avatar
Mr. W3stik:

Nene odpověď stačila :) Mm teď trošku rušno ve škole tak jsem nestihl odpověďet. Moc děkuji za pomoc :)

 
Nahoru Odpovědět 13.5.2015 18:04
Avatar
vodslon
Člen
Avatar
Odpovídá na Mr. W3stik
vodslon:

Mě totiž mrzí, že máš za učitele stejného blba, jako jsem měl já. Ten nás učil VB stylem, že jsme se museli naučit nazpamět kod :-), takže to všem, včetně mě, strašně zhnusil. Prostě neřekl co jaká část kodu dělá, ale musel si nazpamět napsat kalkulačku, demence..

 
Nahoru Odpovědět 14.5.2015 7:58
Avatar
hanpari
Redaktor
Avatar
Odpovídá na vodslon
hanpari:

Co je to vb styl? Co tim myslis?

 
Nahoru Odpovědět 14.5.2015 9:14
Avatar
Honza
Člen
Avatar
Odpovídá na hanpari
Honza:

Řekl bych že ta věta byla myšlena tak, že způsob kterým učitel učil VB byl takový, že se museli učit nazpaměť kód :)

Editováno 14.5.2015 10:15
Nahoru Odpovědět  +1 14.5.2015 10:15
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
vodslon
Člen
Avatar
 
Nahoru Odpovědět 14.5.2015 11:41
Avatar
vodslon
Člen
Avatar
Odpovídá na Honza
vodslon:

No já jsem to z toho tak pochopil, že jim to dává opsat a nic jim k tomu neřekne a nebo možná sem se potřeboval jenom vybrečet :D

 
Nahoru Odpovědět 14.5.2015 11:42
Avatar
hanpari
Redaktor
Avatar
Odpovídá na vodslon
hanpari:

No, já jsem ve vb dělal, ale kód jsem se nazpaměť neučil, potud nechápu, proč právě visual basic. Chápal bych, kdyby někdo starému VB vyčítal, že je to klikátko, ale jinak je to programovací jazyk jako každý jiný.

 
Nahoru Odpovědět 14.5.2015 12:21
Avatar
vodslon
Člen
Avatar
Odpovídá na hanpari
vodslon:

Myslím, že si nerozumím, já jsem neříkal nic proti VB, ale proti učiteli, který mě ho na SŠ učil a to stylem, že nám dal A4 kod a naučit nazpamět nebo velmi podobným stylem.

 
Nahoru Odpovědět 14.5.2015 13:16
Avatar
dirtyjobs
Člen
Avatar
Odpovídá na vodslon
dirtyjobs:

Měl jsi mu říct, že v Bohnicích se uvolnilo jedno lukrativní místo.

 
Nahoru Odpovědět 14.5.2015 15:14
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 18 zpráv z 18.