Pravidla Ucet
Nepřihlášen

Článek

Menu

Rozmazání obrázku
Napsal: MEN-Y
Přidáno: 19.12. 2010

Jednoduchý způsob rozmazání obrázku

Princip rozmazání

Ono je to vlastně velice jednoduché, barva každého pixelu obrázku se rovnoměrně složí z barev okolních pixelů (počet pixelů, ze kterých se skládá, pak určuje míru rozmazání). Například, když bude míra rozmazání 3 (tedy tři pixely z každé strany), bude se výsledná barva skládat z 1/9 každého pixelu v čtverci 3x3. Lépe (ale anglicky) je popsané tady.

Kód

Dosti teorie, nejlépe to asi pochopíte z výsledného kódu. Pracuji s spritem s_test
w = sprite_get_width(s_test);
h = sprite_get_height(s_test);

intenzita = 5;
konstanta = 1 / (intenzita * intenzita);
xstred = floor(intenzita / 2);
ystred = floor(intenzita / 2);

// Zapíšeme obrázek, který chceme rozmazat do surface, aby se na něj dalo použít surface_getpixel - scanovaný obrázek nemusí být vykreslený
source = surface_create(w,h);
surface_set_target(source);
draw_sprite(s_test,0,0,0);
surface_reset_target();

//Protože budeme pracovat s každým pixelem několikrát (viz princip), bude lepší si obrázek předscanovat
for(xx = 0; xx < w; xx+=1)
  for(yy = 0; yy < h; yy+=1)
    pixel[xx,yy] = surface_getpixel(source,xx,yy);

sur = surface_create(w,h);
surface_set_target(sur);

for(xx = 0; xx < w; xx+=1)
{
  for(yy = 0; yy < h; yy+=1)
  {
    r = 0;
    g = 0;
    b = 0;
    for(fx = 0; fx < intenzita; fx+=1)
    {
      for(fy = 0; fy < intenzita; fy+=1)
      {
        x0 = xx - xstred + fx;
        y0 = yy - ystred + fy;
        
        if (x0 > 0 && x0 < w && y0 > 0 && y0 < h)
        {
          barva = pixel[x0,y0];
        } else {
          barva = pixel[xx,yy];
        }
        r += color_get_red(barva) * konstanta;
        g += color_get_green(barva) * konstanta;
        b += color_get_blue(barva) * konstanta;
      }
    }
    draw_point_color(xx,yy,make_color_rgb(r,g,b));
  }
}
surface_reset_target();

Výsledek

Závěr

Bohužel, v GameMakeru (ale nejen v něm) je funkce surface_getpixel velice, velice pomalá, takže si na nějaké realtime (xD) rozmazávání můžete nechat zajít chuť. Taky, když nad tím přemýšlím, k čemu to teda je?

Stažení

GM8
Klíčová slova: obrázek rozmazání blur
 

Komentáře:

Napsal: Wailey
Přidáno: 06.07. 2011

myslel jsi SurfaceFix.dll ne ? :P http://gmc.yoyogames.com/index.php?showtopic=454468

Trvalý odkaz

Napsal: Senzi
Přidáno: 21.12. 2010

Hezkej tutoš! Ale realtime to vážně jde, jen né přímo tímto způsobem a je na to potřeba SirfaceFix.dll :D

Trvalý odkaz

Napsal: NicharCZ
Přidáno: 19.12. 2010

Podobný efekt dostaneš "blurováním" přímo v editoru GM8. Máš tam ale pouze 3 škály, ale můžeš je kombinovat. Tohle je přesnější v tom smyslu, že si to nastavíš, jak sám chceš.. Moce pěkný.. :))

Trvalý odkaz

Velkej Chytrák
Copyright (c) 2001-2010