Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2009, 18:17   #1
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию Antialiasing ARGB

Приветствую.
Ну сразу к делу, известно что антиалиасинг это среднее арифметическое пикселей вокруг текущего. Да, вроде все легко. Но если есть состовляющия A (alpha channel). То как быть ? Причем, если (в моем случае) то на чем рисуем, это область залитая 0x0 на пиксель, значит и alpha будет 0. Дело в том, что я накладываю изображение, все нормально, но по краям я делаю наклон (сжимаю построчно) и там образуются "зубчики". Вот их мне как то надо сгладить. Если даже крутится вокруг средней арифметической по альфу каналу, то тогда все тянется так же и к местам целевого изображения, т.е. в середине рисунка оказывается прозрачность совсем не та. Ну или, сначала рисую, а потом пробегаюсь и смешиваю, но тогда выходит что, цвет например фон (т.е. ARGB == 0) тогда получится надо делать прозрачнее, но в тоже время, это цвет черный, т.е. затемняется часть.
Как обычно надеюсь на отклик
BOBAH13 вне форума Ответить с цитированием
Старый 11.12.2009, 19:56   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Ну, если зубчики, то можно сказать и области, т.е. RECT, да?
Может, такой вариант можно использовать:
Код:
Автор: http://www.swissdelphicenter.ch 
{The parameter "percent" needs an integer between 0 and 100
(include zero and 100). If "Percent" is 0, there will be no effect.
If it's 100 there will be the strongest effect.}

procedure Antialising(C: TCanvas; Rect: TRect; Percent: Integer);
var
  l, p: Integer;
  R, G, B: Integer;
  R1, R2, G1, G2, B1, B2: Byte;
begin
  with c do
  begin
    Brush.Style := bsclear;
    lineto(200, 100);
    moveto(50, 150);
    Ellipse(50, 150, 200, 30);
    for l := Rect.Top to Rect.Bottom do
    begin
      for p := Rect.Left to Rect.Right do
      begin
        R1 := GetRValue(Pixels[p, l]);
        G1 := GetGValue(Pixels[p, l]);
        B1 := GetBValue(Pixels[p, l]);

        //Pixel links
        //Pixel left
        R2 := GetRValue(Pixels[p - 1, l]);
        G2 := GetGValue(Pixels[p - 1, l]);
        B2 := GetBValue(Pixels[p - 1, l]);

        if (R1 <> R2) or (G1 <> G2) or (B1 <> B2) then
        begin
          R := Round(R1 + (R2 - R1) * 50 / (Percent + 50));
          G := Round(G1 + (G2 - G1) * 50 / (Percent + 50));
          B := Round(B1 + (B2 - B1) * 50 / (Percent + 50));
          Pixels[p - 1, l] := RGB(R, G, B);
        end;

        //Pixel rechts
        //Pixel right
        R2 := GetRValue(Pixels[p + 1, l]);
        G2 := GetGValue(Pixels[p + 1, l]);
        B2 := GetBValue(Pixels[p + 1, l]);

        if (R1 <> R2) or (G1 <> G2) or (B1 <> B2) then
        begin
          R := Round(R1 + (R2 - R1) * 50 / (Percent + 50));
          G := Round(G1 + (G2 - G1) * 50 / (Percent + 50));
          B := Round(B1 + (B2 - B1) * 50 / (Percent + 50));
          Pixels[p + 1, l] := RGB(R, G, B);
        end;

        //Pixel oben
        //Pixel up
        R2 := GetRValue(Pixels[p, l - 1]);
        G2 := GetGValue(Pixels[p, l - 1]);
        B2 := GetBValue(Pixels[p, l - 1]);

        if (R1 <> R2) or (G1 <> G2) or (B1 <> B2) then
        begin
          R := Round(R1 + (R2 - R1) * 50 / (Percent + 50));
          G := Round(G1 + (G2 - G1) * 50 / (Percent + 50));
          B := Round(B1 + (B2 - B1) * 50 / (Percent + 50));
          Pixels[p, l - 1] := RGB(R, G, B);
        end;

        //Pixel unten
        //Pixel down
        R2 := GetRValue(Pixels[p, l + 1]);
        G2 := GetGValue(Pixels[p, l + 1]);
        B2 := GetBValue(Pixels[p, l + 1]);

        if (R1 <> R2) or (G1 <> G2) or (B1 <> B2) then
        begin
          R := Round(R1 + (R2 - R1) * 50 / (Percent + 50));
          G := Round(G1 + (G2 - G1) * 50 / (Percent + 50));
          B := Round(B1 + (B2 - B1) * 50 / (Percent + 50));
          Pixels[p, l + 1] := RGB(R, G, B);
        end;
      end;
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Antialising(Image1.Canvas, Image1.Canvas.ClipRect, 100);
end;
Я не спец в области графики, так что могу и ошибиться по поводу применимости этой процедуры
mihali4 вне форума Ответить с цитированием
Старый 11.12.2009, 19:58   #3
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

mihali4 спасибо за отклик, но может быть и подошел бы вариантик, просто кулючевое слово ARGB меня в основном в тупик ставит альфа состовляющая.
BOBAH13 вне форума Ответить с цитированием
Старый 12.12.2009, 01:32   #4
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

мм.. А зачем альфу алиасить? А если оставлять как есть?
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 12.12.2009, 10:06   #5
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от mutabor Посмотреть сообщение
мм.. А зачем альфу алиасить? А если оставлять как есть?
не было бы зачем не спрашивал у меня окно layered. Думаю ясно.
BOBAH13 вне форума Ответить с цитированием
Старый 12.12.2009, 20:53   #6
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Цитата:
мм.. А зачем альфу алиасить? А если оставлять как есть?
Я тоже думаю, что альфу не надо трогать вовсе... Можно как-нибудь по нагляднее, что там с картинкой получается? Скриншот какой-нибудь...
Цитата:
но по краям я делаю наклон (сжимаю построчно) и там образуются "зубчики".
Хм... А возможно ли, что как-то не так происходит само "сжимание"?


А вообще вопрос хороший... Надо будет поэкспериментировать... Вы на Делфи делаете, через ScanLine?
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 12.12.2009, 21:06   #7
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от DomiNick Посмотреть сообщение
Я тоже думаю, что альфу не надо трогать вовсе... Можно как-нибудь по нагляднее, что там с картинкой получается? Скриншот какой-нибудь...

Хм... А возможно ли, что как-то не так происходит само "сжимание"?


А вообще вопрос хороший... Надо будет поэкспериментировать... Вы на Делфи делаете, через ScanLine?
Видимо одного раза не хватило Я знаю что делаю. У меня окно прозрачное - Layered. Т.е... сделать антиалиасинг возможно только через Alpha канал. Т.к. если альфа будет 255, то как вы интересно получите то что под окном ? Т.е. уже видно что это ерунда.
Сжатие происходит все верно, расчет каждой строки математика - линейно уменьшается смешение с краев.

Edit:
Цитата:
Чтот я совсем запутался.....
Зачем получать то, что под окном? Layered-окно само ж рисуется как надо...
Или вы хотите что-то вроде Blur (матового стекла), как в Висте и семёрке?
Это я написал исходя из того, что Вы намекаите чтобы не использовать альфа канал... тогда надо получать то что под окном. А я говорю, что надо как то качественно проводить антиалиасинг. (Блюр эффект, нет, это тут вообще причем ?)

Последний раз редактировалось BOBAH13; 12.12.2009 в 22:59.
BOBAH13 вне форума Ответить с цитированием
Старый 12.12.2009, 21:17   #8
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Цитата:
Т.к. если альфа будет 255, то как вы интересно получите то что под окном ?
Чтот я совсем запутался.....
Зачем получать то, что под окном? Layered-окно само ж рисуется как надо...
Или вы хотите что-то вроде Blur (матового стекла), как в Висте и семёрке?
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 14.12.2009, 00:40   #9
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
Вопрос

Кнопки "Правка" снова нету... И куда она постоянно ретируется?

Цитата:
Это я написал исходя из того, что Вы намекаите чтобы не использовать альфа канал...
Я имел ввиду просто не трогать его при сглаживании... "Антиалиасить" только по R, G и B...

Если эта тема в продолжение той, то на тамошнем скриншоте всё вроде нормально выглядит... (программа кстати заинтриговала, было б интересно взглянуть, если это не секретные разработки разумеется )


Было б гораздо понятнее с примером "неправильной" картинки.....


Edit:
Цитата:
При определенном угле (на скриншоте 30 градусов) все нормально, т.е. нет зубцов и т.п... при других углах, возможны прямо таки скачки (резкие перепады). Если антиалиасить только RGB то всеравно будут видны скачки, ведь так. Так что...
Если это настолько секретная разработка, что даже скриншот краешка изображения с "зубчиками" нельзя увидеть, то как я смогу помочь?
Как мне попытаться убрать эффект "скачков", которых я в глаза не видел?

Дайте какую-нибудь полупрозрачную картинку-пример (не обязательно из проекта), где присутствует вышеозначенный эффект, тогда будем пытаться.....
I am the First of Cyber Evolution...
I am the First to Program your Future...

Последний раз редактировалось DomiNick; 14.12.2009 в 13:52.
DomiNick вне форума Ответить с цитированием
Старый 14.12.2009, 10:35   #10
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от DomiNick Посмотреть сообщение
Кнопки "Правка" снова нету... И куда она постоянно ретируется?


Я имел ввиду просто не трогать его при сглаживании... "Антиалиасить" только по R, G и B...

Если эта тема в продолжение той, то на тамошнем скриншоте всё вроде нормально выглядит... (программа кстати заинтриговала, было б интересно взглянуть, если это не секретные разработки разумеется )


Было б гораздо понятнее с примером "неправильной" картинки.....
При определенном угле (на скриншоте 30 градусов) все нормально, т.е. нет зубцов и т.п... при других углах, возможны прямо таки скачки (резкие перепады). Если антиалиасить только RGB то всеравно будут видны скачки, ведь так. Так что...
BOBAH13 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
OpenGL - Rendering ARGB BOBAH13 Общие вопросы C/C++ 0 06.12.2009 19:06