Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Antialiasing


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

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

Автор: Oldshelf 11.6.2024, 15:35
Несколько глупых вопросов.

1. Можно пример картинки с 10% сглаживанием, которая выглядит, как предполагалось?
2. Сглаживание происходит после поворота?
3. Что, если отключить поворот при 30% сглаживании? Какой будет результат на краях?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)