Ошибка: Failed to parse the Currency Converter XML document.
$1 977.70


Ошибка: Failed to parse the Currency Converter XML document.
$19 783.54


Ошибка: Failed to parse the Currency Converter XML document.
$2 283.90


Интерполяция изображений в Delphi

Этот алгоритм увеличивает изображение в произвольное количество раз при помощи билинейной интерполяции. При создании нового изображения каждой его точке с целыми координатами (x,y) сопоставляется точка исходного изображения с дробными координатами (xo, yo), xo=x/dx, yo=y/dy (dx и dy — коэффициенты увеличения). Далее нужно провести поверхность через точки, лежащие вокруг (xo, yo). Цвет здесь рассматривается как третье измерение. На поверхности ищется точка с координатами (xo, yo) и ее цвет понимается за цвет точки (x,y) получаемого изображения.

Этот алгоритм хорошо работает при целых или больших коэффициентах увеличения. Но резкие границы размываются. Для уменьшения изображения этот алгоритм также не подходит.


1. Интерполяция изображения
procedure Interpolate(var bm: TBitMap; dx, dy: single);
var
bm1: TBitMap;
z1, z2: single;
k, k1, k2: single;
x1, y1: integer;
c: array [0..1, 0..1, 0..2] of byte;
res: array [0..2] of byte;
x, y: integer;
xp, yp: integer;
xo, yo: integer;
col: integer;
pix: TColor;
begin
bm1 := TBitMap.Create;
bm1.Width := round(bm.Width * dx);
bm1.Height := round(bm.Height * dy);

for y := 0 to bm1.Height — 1 do begin
for x := 0 to bm1.Width — 1 do begin
xo := trunc(x / dx);
yo := trunc(y / dy);
x1 := round(xo * dx);
y1 := round(yo * dy);

for yp := 0 to 1 do
for xp := 0 to 1 do begin
pix := bm.Canvas.Pixels[xo + xp, yo + yp];
c[xp, yp, 0] := GetRValue(pix);
c[xp, yp, 1] := GetGValue(pix);
c[xp, yp, 2] := GetBValue(pix);
end;

for col := 0 to 2 do begin
k1 := (c[1,0,col] — c[0,0,col]) / dx;
z1 := x * k1 + c[0,0,col] — x1 * k1;
k2 := (c[1,1,col] — c[0,1,col]) / dx;
z2 := x * k2 + c[0,1,col] — x1 * k2;
k := (z2 - z1) / dy;
res[col] := round(y * k + z1 - y1 * k);
end;
bm1.Canvas.Pixels[x,y] := RGB(res[0], res[1], res[2]);
end;
Form1.Caption := IntToStr(round(100 * y / bm1.Height)) + ′%′;
Application.ProcessMessages;
if Application.Terminated then Exit;
end;
bm := bm1;
end;

const
dx = 5.5;
dy = 5.5;

procedure TForm1.Button1Click(Sender: TObject);
const
w = 50;
h = 50;
var
bm: TBitMap;
can: TCanvas;
begin
bm := TBitMap.Create;
can := TCanvas.Create;
can.Handle := GetDC(0);
bm.Width := w;
bm.Height := h;
bm.Canvas.CopyRect(Bounds(0, 0, w, h), can, Bounds(0, 0, w, h));
ReleaseDC(0, can.Handle);
Interpolate(bm, dx, dy);
Form1.Canvas.Draw(0, 0, bm);
Form1.Caption := ′?x: ′? + FloatToStr(dx) +
′ y: ′ + FloatToStr(dy) +
′ width: ′ + IntToStr(w) +
′ height: ′ + IntToStr(h);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
bm: TBitMap;
begin
if OpenDialog1.Execute then
bm.LoadFromFile(OpenDialog1.FileName);
Interpolate(bm, dx, dy);
Form1.Canvas.Draw(0, 0, bm);
Form1.Caption := ′?x: ′? + FloatToStr(dx) +
′ y: ′ + FloatToStr(dy) +
′ width: ′ + IntToStr(bm.Width) +
′ height: ′ + IntToStr(bm.Height);
end;

 

Интересное

Удалённое восстановление...
Как импортировать большой SQL-скрипт (дамп базы данных MySQL для форума phpBB), если обычными споcобами (загрузка через web-интерфейс phpMyAdmin, Backup cPanel) проблематична, особенно на модемном...
Подробнее...
Управление сетями. Правила...
Идея создания сетей для передачи данных на большие и не очень большие расcтояния витала в воздухе с той самой поры, как человек впервые задумался над созданием телекоммуникационных устройств. В...
Подробнее...
Настраиваем Apache - FAQ...
В: Что такое Apache и зачем он нужен?О: Apache — это web-сервер, один из наиболее распространенных, безопасных и удобных во всем мире. Если вы создаете свой динамичный сайт с использованием языков...
Подробнее...
Коды ответов сервера
В первой строке ответа HTTP-сервера содержится информация о том, был запрос клиента успешным или нет, а также данные о причинах успешного либо неуспешного завершения запроса. Эта информация...
Подробнее...
ШРИФТ
Удобочитаемость шрифта.Удобочитаемость является одним из важнейших достоинств хорошего шрифта. Это не только общая оценка пригодности его формы, но и показатель красоты. На удобочитаемость влияют...
Подробнее...
FreeBSD под эмулятором Bochs
В этой статье описывается мой опыт по сборке урезанного варианта FreeBSD «с нуля» и запуска ее под эмулятором Bochs. Основываясь на статье Йенса Швайкхардта (Jens Schweikhardt) «FreeBSD From...
Подробнее...
Восстановление Windows XP
1. Система не загружается, что делать? Восстановить систему в XP будет гораздо проще, если заранее об этом позаботиться. Наиболее радикальным методом будет сохранение всех основных системных...
Подробнее...
Протокол SOCKS 5
Этот документ описывает протокол связи по стандартам Интернет, и открытдля обсуждения и предложений. Пожалуйста обращайтесь к текущей редакции«Internet Official Protocol Standards»...
Подробнее...
FAQ по разделу CGI интерфейс
Как мне сделать аутентификацию на Перле, а не средствами веб-сервера?:Для того, чтобы браузер выдал запрос логина и пароля, скрипт должен выдать следующие заголовки: print «WWW-Authenticate:...
Подробнее...
Модемы: Наиболее часто...
Если у вас используется модем со стандартной прошивкой любого исполнения, кроме us/canada, то изменяя состояние регистра s39, можно регулировать уровень выходного сигнала. Чем меньшее число...
Подробнее...