Изменить размер 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 прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |