Wygładzanie krawędzi Canvas

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Wygładzanie krawędzi Canvas

Nowy postprzez usermaw » niedziela, 20 wrzeÅ›nia 2009, 12:44

Witam Was serdecznie.
Mam krótkie i proste pytanie dla wyjadaczy.
Jak wygładzić krawędzie tego, co narysowało Canvas?
Canvas chyba nie posiada żadnych metod wygładzających, a więc efekt małych schodeczków jest nieunikniony, bo piksela nie podzielę na dwa.
Dla dużych elementów, może to mało istotne, ale małe elementy wyglądają mało estetycznie.

Mam pomysł, aby używać jakiegoś programowego rozwiązania za pomocą DirectX (DirectDraw), ale kompletnie nie wiem jak się do tego zabrać.


Pozdro
Avatar użytkownika
usermaw
Homos antropiczny
Homos antropiczny
 
Posty: 55
Dołączył(a): piątek, 2 stycznia 2009, 20:43
PodziÄ™kowaÅ‚ : 2
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Wygładzanie krawędzi Canvas

Nowy postprzez Cyfrowy Baron » niedziela, 20 wrzeÅ›nia 2009, 15:18

Efekt rozmycia. Kod pochodzi z nieistniejącego już serwisu Strefa C++ Buildera

Kod: Zaznacz cały
#define FIX0(x) (x < 0 ? 0 : x)
#define CLIP255(x) (x > 255 ? 255 : x)

void TForm1::BlurBitmap(Graphics::TBitmap* ABitmap)
{
   assert(ABitmap != NULL);
   ABitmap->PixelFormat = pf24bit;

   float l1 = StrToFloat(Edit1->Text);
   float l2 = StrToFloat(Edit2->Text);
   float l3 = StrToFloat(Edit3->Text);
   float l4 = StrToFloat(Edit4->Text);
   float l5 = StrToFloat(Edit5->Text);
   float l6 = StrToFloat(Edit6->Text);
   float l7 = StrToFloat(Edit7->Text);
   float l8 = StrToFloat(Edit8->Text);
   float l9 = StrToFloat(Edit9->Text);

   float h[][3] =
      {{l1, l2 ,l3 },
       {l4, l5, l6},
       {l7, l8, l9}};

   const int width = ABitmap->Width;
   const int height = ABitmap->Height;

   for (int y = 1; y < height - 1; ++y)
   {
      RGBTRIPLE* line_prev =
         static_cast(ABitmap->ScanLine[y - 1]);
      RGBTRIPLE* line_curr =
         static_cast(ABitmap->ScanLine[y]);
      RGBTRIPLE* line_next =
         static_cast(ABitmap->ScanLine[y + 1]);

      for (int x = 1; x < width - 1; ++x)
      {
         float blue =
            (h[0][0] * static_cast<float>(line_prev[x - 1].rgbtBlue)) +
            (h[0][1] * static_cast<float>(line_prev[x].rgbtBlue)) +
            (h[0][2] * static_cast<float>(line_prev[x + 1].rgbtBlue)) +
            (h[1][0] * static_cast<float>(line_curr[x - 1].rgbtBlue)) +
            (h[1][1] * static_cast<float>(line_curr[x].rgbtBlue)) +
            (h[1][2] * static_cast<float>(line_curr[x + 1].rgbtBlue)) +
            (h[2][0] * static_cast<float>(line_next[x - 1].rgbtBlue)) +
            (h[2][1] * static_cast<float>(line_next[x].rgbtBlue)) +
            (h[2][2] * static_cast<float>(line_next[x + 1].rgbtBlue));

         float green =
            (h[0][0] * static_cast<float>(line_prev[x - 1].rgbtGreen)) +
            (h[0][1] * static_cast<float>(line_prev[x].rgbtGreen)) +
            (h[0][2] * static_cast<float>(line_prev[x + 1].rgbtGreen)) +
            (h[1][0] * static_cast<float>(line_curr[x - 1].rgbtGreen)) +
            (h[1][1] * static_cast<float>(line_curr[x].rgbtGreen)) +
            (h[1][2] * static_cast<float>(line_curr[x + 1].rgbtGreen)) +
            (h[2][0] * static_cast<float>(line_next[x - 1].rgbtGreen)) +
            (h[2][1] * static_cast<float>(line_next[x].rgbtGreen)) +
            (h[2][2] * static_cast<float>(line_next[x + 1].rgbtGreen));

         float red =
            (h[0][0] * static_cast<float>(line_prev[x - 1].rgbtRed)) +
            (h[0][1] * static_cast<float>(line_prev[x].rgbtRed)) +
            (h[0][2] * static_cast<float>(line_prev[x + 1].rgbtRed)) +
            (h[1][0] * static_cast<float>(line_curr[x - 1].rgbtRed)) +
            (h[1][1] * static_cast<float>(line_curr[x].rgbtRed)) +
            (h[1][2] * static_cast<float>(line_curr[x + 1].rgbtRed)) +
            (h[2][0] * static_cast<float>(line_next[x - 1].rgbtRed)) +
            (h[2][1] * static_cast<float>(line_next[x].rgbtRed)) +
            (h[2][2] * static_cast<float>(line_next[x + 1].rgbtRed));


         blue = blue / 1.8;     // 0.2 * 9
         green = green / 1.8;   // 0.2 * 9
         red = red / 1.8;       // 0.2 * 9

         line_curr[x].rgbtBlue = FIX0(CLIP255(blue));
         line_curr[x].rgbtGreen = FIX0(CLIP255(green));
         line_curr[x].rgbtRed = FIX0(CLIP255(red));
      }
   }
}


void __fastcall TForm1::Button1Click(TObject *Sender)
{
BlurBitmap(Image1->Picture->Bitmap);
Image1->Repaint();
}
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Wygładzanie krawędzi Canvas

Nowy postprzez usermaw » poniedziaÅ‚ek, 21 wrzeÅ›nia 2009, 19:50

Witam
Dzięki Baronie za fatyge i szybka odpowiedz. Chwilowo nie mam czasu, ale nie omieszkam sprawdzic kodu.
Na pewno kodzis przyda siÄ™ do wielu rzeczy

Pozdro
Avatar użytkownika
usermaw
Homos antropiczny
Homos antropiczny
 
Posty: 55
Dołączył(a): piątek, 2 stycznia 2009, 20:43
PodziÄ™kowaÅ‚ : 2
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje multimedialne, graficzne

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 3 gości

cron