![]() |
![]() ![]() ![]() ![]() |
|
Изменить размер BitmapDelphi , Графика и Игры , BitmapИзменить размер Bitmap
Оформил: DeeCo
{
This function resizes a bitmap calculating the average color of a rectangular
area of pixels from source bitmap to a pixel or a rectangular area to target
bitmap.
It produces a soft-color and undistorsioned result image unlike the StretchDraw
method
I think that this method have a tenichal name, but I am not sure.
As you can see, this function could be very optimized :p
}
procedure TFormConvertir.ResizeBitmap(imgo, imgd: TBitmap; nw, nh: Integer);
var
xini, xfi, yini, yfi, saltx, salty: single;
x, y, px, py, tpix: integer;
PixelColor: TColor;
r, g, b: longint;
function MyRound(const X: Double): Integer;
begin
Result := Trunc(x);
if Frac(x) >= 0.5 then
if x >= 0 then Result := Result + 1
else
Result := Result - 1;
// Result := Trunc(X + (-2 * Ord(X < 0) + 1) * 0.5);
end;
begin
// Set target size
imgd.Width := nw;
imgd.Height := nh;
// Calcs width & height of every area of pixels of the source bitmap
saltx := imgo.Width / nw;
salty := imgo.Height / nh;
yfi := 0;
for y := 0 to nh - 1 do
begin
// Set the initial and final Y coordinate of a pixel area
yini := yfi;
yfi := yini + salty;
if yfi >= imgo.Height then yfi := imgo.Height - 1;
xfi := 0;
for x := 0 to nw - 1 do
begin
// Set the inital and final X coordinate of a pixel area
xini := xfi;
xfi := xini + saltx;
if xfi >= imgo.Width then xfi := imgo.Width - 1;
// This loop calcs del average result color of a pixel area
// of the imaginary grid
r := 0;
g := 0;
b := 0;
tpix := 0;
for py := MyRound(yini) to MyRound(yfi) do
begin
for px := MyRound(xini) to MyRound(xfi) do
begin
Inc(tpix);
PixelColor := ColorToRGB(imgo.Canvas.Pixels[px, py]);
r := r + GetRValue(PixelColor);
g := g + GetGValue(PixelColor);
b := b + GetBValue(PixelColor);
end;
end;
// Draws the result pixel
imgd.Canvas.Pixels[x, y] :=
rgb(MyRound(r / tpix),
MyRound(g / tpix),
MyRound(b / tpix)
);
end;
end;
end;
Привет! Я переведу текст на русский язык: Это фрагмент кода Delphi, который использует алгоритм среднего значения для изменения размера изображения битмапы с целью получения мягкого цвета и без искажений. Функция Вот разбивка кода:
Главный цикл проходит через каждый пиксель в целевом изображении, используя коэффициенты масштабирования для определения области пикселей из источника битмапы, которые нужно среднестатистически. Для каждого пикселя в целевом изображении:
Код использует несколько функций:
Код оптимизирован использованием одиночной цикла для каждого пикселя в целевом изображении, а не проходимся через каждый пиксель в источнике битмапы отдельно. Это уменьшает общую вычислительную нагрузку и использование памяти. Автор отмечает, что данный алгоритм производит мягкий цвет и без искажений, что часто желательно при изменении размера изображений. Однако он может не быть подходящим для всех случаев использования, таких как высокоскоростное обрабатывание или точная цветовая точность. Некоторые потенциальные улучшения для рассмотрения:
Функция ResizeBitmap изменяет размер битмапа, рассчитывая среднее значение цвета прямоугольной области пикселей из исходного битмапа в пиксел или прямоугольную область целевого битмапа. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 | ||||