IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Масштабирования растровых рисунков
Bokul
сообщение 22.08.2006 5:46
Сообщение #1


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


Подскажите, пожалуйста, алгоритм масштабирования рисунков. Рисунок представляет собой двумерный массив, каждый елемент которого определяет цвет соответствующего пикселя на рисунке.

Сообщение отредактировано: Bokul - 22.08.2006 5:46


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
klem4
сообщение 24.08.2006 22:37
Сообщение #2


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Вот, реализовал свою идею smile.gif Грубовато конечно, до билинейной фильрации тут далеко :D

Управление W - увеличить, S - уменьшить

{$mode objfpc}

uses Crt, WinCrt, Graph;

type

TCoordinate = LongInt;

const

mx : TCoordinate = 0;
my : TCoordinate = 0;
cx : TCoordinate = 0;
cy : TCoordinate = 0;

type

TColor = 0..15;

TInfo = TColor;

TRastr = array of array of TInfo;

TImage = Object

src, rslt : TRastr; // исходная и конечная матрицы

sx, sy : Integer; // размеры исходной матрицы

x1, y1, x2, y2 : TCoordinate; // координаты захвата изображения

zoom : Integer; // текущее состояние картинки (0 - исходное состояние)

constructor Init(x_1, y_1, x_2, y_2 : TCoordinate);
destructor Done;

(*
захват изображения,
(x_1, y_1) - левая верхняя точка
(x_2, y_2) - правая нижняя точка
*)

procedure GetSourceRastr; // заполнение исходной матрицы
procedure GetResultRastr(up : boolean); // получение рузультирующей матрицы

procedure ShowCentre;

end;

constructor TImage.Init(x_1, y_1, x_2, y_2 : TCoordinate);
begin

x1 := x_1;
y1 := y_1;

x2 := x_2;
y2 := y_2;

sx := x2 - x1 + 1;
sy := y2 - y1 + 1;

SetLength(src, sx, sy);

zoom := 0;

end;

destructor TImage.Done;
begin
SetLength(src, 0, 0);
SetLength(rslt, 0, 0);
end;

procedure TImage.GetSourceRastr;
var
x, y : TCoordinate;
begin

for x := 0 to sx - 1 do
for y := 0 to sy - 1 do
src[x, y] := GetPixel(x + x1, y + y1);
end;

procedure TImage.GetResultRastr(up : boolean);
var
x, y, rx, ry : TCoordinate;
scale : integer;
begin

case up of
true : scale := +2;
false : scale := -2;
end;

if scale + zoom < 0 then exit; // уменьшить меньше исходного нельзя

zoom := zoom + scale;

if up then begin

SetLength(rslt, sx * 2, sy * 2);

for x := 0 to sx - 1 do
for y := 0 to sx - 1 do
for rx := 2 * x to 2 * x + 1 do
for ry := 2 * y to 2 * y + 1 do
rslt[rx, ry] := src[x, y];


sx := sx * 2;
sy := sy * 2;

SetLength(src, 0, 0);
SetLength(src, sx , sy);

src := rslt;

end else begin

SetLength(rslt, sx div 2, sy div 2);

x := 0;
rx := 0;

while (x <= sx - 1) do begin

y := 0;
ry := 0;

while (y <= sy - 1) do begin
rslt[rx, ry] := src[x, y];
inc(y, 2);
inc(ry);
end;

inc(x, 2);
inc(rx);

end;

sx := sx div 2;
sy := sy div 2;

SetLength(src, 0, 0);
SetLength(src, sx, sy);

src := rslt;

end;

end;

procedure TImage.ShowCentre;
var
x, y : TCoordinate;
begin
for x := 0 to sx - 1 do
for y := 0 to sy - 1 do
PutPixel(x + cx - sx div 2, y + cy - sy div 2, src[x, y]);
end;

procedure GrInit;
var
gd, gm, ge : SmallInt;
begin

gd := Detect;

InitGraph(gd, gm, '');

ge := GraphResult;

if ge <> grOk then begin

writeln('GraphError : ', GraphErrorMsg(ge));
readkey;
Halt(1);

end;

mx := GetMaxX;
my := GetMaxY;

cx := mx div 2;
cy := my div 2;

end;

var

Image : TImage;
ch : char;

begin

clrscr;
GrInit;

// рисуем что-то ...

SetFillStyle(1, BLUE);
SetColor(RED);
//Rectangle(cx - 10, cy - 10, cx + 10, cy + 10);
Bar3D(cx - 10, cy - 10, cx + 10, cy + 10, 7, true);
FloodFill(cx, cy, RED);
SetColor(YELLOW);
Circle(cx, cy, 5);

// нарисовали

Image.Init(cx - 50, cy - 50, cx + 50, cy + 50); // захватываем область

Image.GetSourceRastr; // получаем исходную матирцу

repeat

ch := readkey;

case ch of
'w','W' : Image.GetResultRastr(true); // увеличение
's','S' : Image.GetResultRastr(false); // уменьшение
end;

ClearDevice;

Image.ShowCentre; // показвыаем

until ch = #27; // если ESC то выход

Image.Done;

Readkey;

CloseGraph;
end.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Bokul   Масштабирования растровых рисунков   22.08.2006 5:46
Bokul   С увеличениям в целое количество раз я вроде разоб...   22.08.2006 7:46
Бродяжник   Копайте в сторону билинейной фильтрации. Кое-что м...   22.08.2006 8:22
volvo   var zoomx, zoomy: real; procedure pzoom; var i,...   22.08.2006 8:25
klem4   Если конечно не обязательно работать с матрицой пи...   22.08.2006 16:52
volvo   klem4, а не работает :) Это во-первых. Объясни мн...   22.08.2006 17:18
klem4   У тебя одно и тоже выводится ?   22.08.2006 17:23
volvo   Конечно... А ничего другого я и не ждал... Смотри:...   22.08.2006 17:35
klem4   :blink: :!fie: И правда, соотношение то не ...   22.08.2006 17:55
Bokul   А поподробнее можна? :rolleyes: volvo, спасибо, ...   23.08.2006 4:01
klem4   По идее так и должно быть, не знаю почему у меня...   23.08.2006 12:33
Бродяжник   Bokul Чтобы это объяснить поподробнее, мне надо са...   23.08.2006 14:35
Archon   Вот, что я нашёл в обучалках асфиксии. На аглицком...   23.08.2006 15:33
klem4   Вот, реализовал свою идею :) Грубовато конечно, до...   24.08.2006 22:37
volvo   :blink: Я вот никак не могу понять, чего она так п...   24.08.2006 23:16
klem4   Думаю по тому, что картинка отображается попиксель...   24.08.2006 23:18
volvo   Ха... Да, ты прав... Это именно отрисовка тормозит...   24.08.2006 23:37
Bokul   klem4, не мог бы ты выложить файл с твоим кодом, а...   24.08.2006 23:51
volvo   Кстати, вот так будет ГОРАЗДО быстрее (PutPixel - ...   25.08.2006 0:05
klem4   Bokul, держи   25.08.2006 9:15
Bokul   klem4, и с этим кодом у меня проблемы... :mega_cho...   25.08.2006 18:32
volvo   В FPC 2.0.0 прекрасно отрабатывает... (только я за...   25.08.2006 19:03
klem4   ммм Переключи клаву в режим латинских букв (кода к...   25.08.2006 19:48
Bokul   Не то, ни другое не подошло. Наверное у моего Fr...   25.08.2006 23:46
Bokul   array of array SetLength Я так понял что это о...   26.08.2006 0:05
volvo   У тебя полный дистрибутив? Тогда в файле /DOC/REF....   26.08.2006 0:30
Bokul   Спасибо :good: , почитаем.   26.08.2006 0:36


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 9.10.2025 4:32
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"