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