[C#] Brush genereren

Pagina: 1
Acties:

  • Brupje
  • Registratie: September 2001
  • Laatst online: 04-09-2025
Voor mijn hobby projectje wil ik met een kwast gaan tekenen. Nu heb ik verzonnen dat dit het beste kan door een mask image te gebruiken en daarmee op een lokatie op het plaatje een kleur op patroon te 'blitten'. Tot zover niet zoveel bijzonders, alleen wil ik het zo generiek hebben dat ik mbv een 'hardness' aan kan geven hoe scherp de brush is.

Ik heb dus een bron, bijvoorbeeld deze PNG:
Afbeeldingslocatie: http://img245.imageshack.us/img245/1089/brushvi4.png

En aan de hand van de hardness moeten de randen transparanter worden, zoals bij een hoop tekenprogramma's gebeurd. Nu heb ik dit al voor elkaar gekregen:

Afbeeldingslocatie: http://img169.imageshack.us/img169/5271/brushtested2.th.jpg

Het werkt ongeveer zo:
per pixel in het bron plaatje, kijk ik X aantal pixel in de omgeving naar transparante pixels. Dus als we bij pixel 5,5 zijn en ik kijk 5 pixels ver checkt hij alles in een circel van 5 pixels. Per (semi)transparante pixel in de omgeving kijk ik hoever deze weg is van de huidige pixel en bereken dan hoeveel transparanter de huidige pixel gaat worden. Dit hele gebeuren is iteratief, dus kan een aantal keer herhaald worden. Met de schuifbalken is in te stellen hoeveel pixels ver we kijken, hoeveel iteraties we er overdoen,en een zwaarte (hoe hoger hoe sneller een pixel transparant word).

Maar het bevalt me nog niet. Op de eerste plaats is het tergend langzaam, hij moet x aantal iteraties alle pixels af en per pixel x aantal pixels in de omgeving kijken. Op de tweede plaats heb ik 3 schuifbalken ipv 1 schuifbalk genaamd hardness.

Ik moet dus eigenlijk code verzinnen die het beter doet, maar dit is al poging 3 dus zou wel wat hulp kunnen gebruiken ;) Als het me uberhaupt is gelukt mijn probleem duidelijk te maken ;p

Voor de volledigheid hier de code (wordt aantal iteraties keer uitgevoerd):
feather is hoever we kijken, hardness de zwaarte, pixels buiten het bronplaatje zijn 100% transparant

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
unsafe void  MakeBrush(BitmapData src, BitmapData dst, int feather, int hardness)
        {
            int[,] BrushVec = new int[dst.Width,dst.Height];
            byte * ptr = (byte *) src.Scan0 ;
            byte * ptr2 = (byte *) dst.Scan0 ;
            int pos;
            int dist;
            int Transparency;
            
            for (int y = 0; y< src.Height; y++)
            {
                for (int x = 0; x< src.Width; x++)
                {   
                    pos =  GetPos(x,y,src.Width,src.Height);
                    ptr2 = (byte *) dst.Scan0+pos;
                    ptr = (byte *) src.Scan0+pos;
                    Transparency =ptr[3];
                    for (int iy = -feather; iy< feather; iy++)
                        for (int ix = -feather; ix< feather; ix++)
                        if ((ix != 0) && (iy != 0))
                    {
                        pos =  GetPos(x+ix,y+iy,src.Width,src.Height);
                        dist =(int) Math.Round( Math.Sqrt(( Math.Abs(ix) *Math.Abs(ix)) + ( Math.Abs(iy) *Math.Abs(iy))));
                        if (dist<=feather)  
                        if (pos > -1)
                        {
                            
                            
                            ptr = (byte *) src.Scan0+pos;
                            Transparency -=(hardness+255-ptr[3])/(dist+1)/40;
                            
                        }
                        else
                        {
                            Transparency -= (hardness+255)/(dist+1)/40;
                        }
                    }
                    
                            
                    if (Transparency<0)
                     Transparency=0;
                    ptr2[3] =(byte) Transparency ;
                }
                
            }
            
        }

Zie ook 123-3D voor 3D-printer stuff