Доброго времени суток. Я бы хотела попросить помощи, если это возможно. У меня есть приложение дневник, в котором хранятся картинки и видео. Собственно, картинки, которые хранятся по датам вываливаются миниатюрами с рамками (аля как на старых фото) и вот именно тут возникла проблема. При повороте картинки, рамка становится похожа на ступеньки. Исправить это у меня получилось с помощью сглаживания, но... Код найден в просторах инета
| Код | 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% - всё отлично, но рамка становится пикселизированной.
Собственно вопрос - если есть готовое решение, то подскажите, пожалуйста. Если нет, подскажите куда смотреть, за документацией.
Проект не коммерческий, поэтому прошу помощи с готовым кодом. Я делаю дневник для своей собаки 
|