Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Antialiasing 
:(
    Опции темы
Hiori
Дата 11.6.2024, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 29.3.2016

Репутация: нет
Всего: нет



Доброго времени суток.
Я бы хотела попросить помощи, если это возможно.
У меня есть приложение дневник, в котором хранятся картинки и видео. Собственно, картинки, которые хранятся по датам вываливаются миниатюрами с рамками (аля как на старых фото) и вот именно тут возникла проблема. При повороте картинки, рамка становится похожа на ступеньки. Исправить это у меня получилось с помощью сглаживания, но...
Код найден в просторах инета
Код

procedure TBitmapWrap.Antialiasing(Percent: Integer);
type
   TRGBTripleArray = array[0..32767] of TRGBTriple;
   PRGBTripleArray = ^TRGBTripleArray;
var
   SL, SL2: PRGBTripleArray;
   l, m, p: Integer;
   R, G, B: TColor;
   R1, R2, G1, G2, B1, B2: Byte;
begin
with Canvas do
begin
  Brush.Style  := bsClear;
  Pixels[1, 1] := Pixels[1, 1];
  for l := 0 to Height - 1 do
  begin
    SL := ScanLine[l];
    for p := 1 to Width - 1 do
    begin
      R1 := SL[p].rgbtRed;
      G1 := SL[p].rgbtGreen;
      B1 := SL[p].rgbtBlue;

      // Left
     if (p < 1) then m := Width
      else
        m := p - 1;
      R2 := SL[m].rgbtRed;
      G2 := SL[m].rgbtGreen;
      B2 := SL[m].rgbtBlue;
      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));
        SL[m].rgbtRed := R;
        SL[m].rgbtGreen := G;
        SL[m].rgbtBlue := B;
      end;

      //Right
     if (p > Width - 2) then m := 0
      else
        m := p + 1;
      R2 := SL[m].rgbtRed;
      G2 := SL[m].rgbtGreen;
      B2 := SL[m].rgbtBlue;
      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));
        SL[m].rgbtRed := R;
        SL[m].rgbtGreen := G;
        SL[m].rgbtBlue := B;
      end;

      if (l < 1) then m := Height - 1
      else
        m := l - 1;
      //Over
     SL2 := ScanLine[m];
      R2  := SL2[p].rgbtRed;
      G2  := SL2[p].rgbtGreen;
      B2  := SL2[p].rgbtBlue;
      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));
        SL2[p].rgbtRed := R;
        SL2[p].rgbtGreen := G;
        SL2[p].rgbtBlue := B;
      end;

      if (l > Height - 2) then m := 0
      else
        m := l + 1;
      //Under
     SL2 := ScanLine[m];
      R2  := SL2[p].rgbtRed;
      G2  := SL2[p].rgbtGreen;
      B2  := SL2[p].rgbtBlue;
      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));
        SL2[p].rgbtRed := R;
        SL2[p].rgbtGreen := G;
        SL2[p].rgbtBlue := B;
      end;
    end;
  end;
end;
   Synchronization();
end;

При сглаживании 30% и выше - фон, который я задаю при повороте (то, чем заполняется пустота) меняется и, соответственно, картинка отображается не так, как предполагалось (см. картинку), при сглаживании менее 10% - всё отлично, но рамка становится пикселизированной.

Собственно вопрос - если есть готовое решение, то подскажите, пожалуйста. Если нет, подскажите куда смотреть, за документацией.

Проект не коммерческий, поэтому прошу помощи с готовым кодом. Я делаю дневник для своей собаки smile


Это сообщение отредактировал(а) Hiori - 11.6.2024, 12:55

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  Screenshot_4.png 609,89 Kb
PM MAIL   Вверх
Oldshelf
Дата 11.6.2024, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 22.4.2018

Репутация: 1
Всего: 4



Несколько глупых вопросов.

1. Можно пример картинки с 10% сглаживанием, которая выглядит, как предполагалось?
2. Сглаживание происходит после поворота?
3. Что, если отключить поворот при 30% сглаживании? Какой будет результат на краях?
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1038 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.