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

 

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