OberonCore
https://forum.oberoncore.ru/

исполнитель для работы с изображениями
https://forum.oberoncore.ru/viewtopic.php?f=7&t=4172
Страница 1 из 1

Автор:  ___ [ Вторник, 27 Ноябрь, 2012 20:55 ]
Заголовок сообщения:  исполнитель для работы с изображениями

добрый день.

есть идея создать простую версию исполнителя для работы с алгоритмами обработки изображений.

представлять картинку как массив пикселей (пиксель, интерег цвета как в Ports, либо 3 составляющих цвета)
как рисовать на вьюшке должен разобраться (видимо, как в роботе), сохранять вьюшку в бмп по простому (контр пробел, правка копировать, но лучше процедурой). не понятно, как загрузить файл бмп, преобразовать его в массив...
в бб нашел 2 примера: ObxBitmap и i21sysBitmaps, но не понятно... (там винапи)

---------------------------------------------------------
какие темы форума нашел:
сама идея упоминалось в теме: Чтение/запись файлов изображений
и в отрывке книги из темы: Отличная новая книга. Отличная!!!

тут сказано, что вроде получилось у людей: Кроссплатформенность в (одном) универсальном исходнике
Цитата:
На КП/ББ мы научились читать картинку из файла *.bmp (модуль Files от Info21) в двумерный массив целого типа, переводить картинку в цветной негатив, в черно-белый вариант, оконтуривать объекты, зеркально отражать и поворачивать, накладывать сетку, масштабировать и "гладить" разными самодельными фильтрами, отрисовывать картинку средствами модуля TPGraphics (тоже от Info21) для просмотра.

в i21eduFiles такого функционала не нашел...
и тут упоминалось: Пожелания писателям учебников
Цитата:
2.Программная обработка фотографий (6-9 класс) с чтением/записью в файлы в упрощенном полноцветном BMP


тут тоже про бмп, но все ранво не понятно: Нужен простой пример отрисовки BMP на форме.

еще на форуме нашел: Модуль работы с Bmp.

Автор:  Илья Ермаков [ Среда, 28 Ноябрь, 2012 03:47 ]
Заголовок сообщения:  Re: исполнитель для работы с изображениями

Ещё смотрите в коллекции компонентов OberonCore подсистему Abf.

Автор:  ___ [ Среда, 28 Ноябрь, 2012 10:37 ]
Заголовок сообщения:  Re: исполнитель для работы с изображениями

Илья Ермаков писал(а):
Ещё смотрите в коллекции компонентов OberonCore подсистему Abf.

абф, если я правильно понимаю, нужен для поддержки разных форматов картинок.
а непонятно самое прстое: как загрузить файл бмп, преобразовать его в массив...

Автор:  Илья Ермаков [ Среда, 28 Ноябрь, 2012 20:27 ]
Заголовок сообщения:  Re: исполнитель для работы с изображениями

Точнее тогда, смотрите библиотеку FreeImage и заголовок к ней из коллекции Цинна, а в Abf можно посмотреть AbhostFreeImage - оно как раз и занимается "подгрузкой картинки в массив"....

Автор:  ___ [ Четверг, 29 Ноябрь, 2012 17:05 ]
Заголовок сообщения:  Re: исполнитель для работы с изображениями

Илья Ермаков писал(а):
Точнее тогда, смотрите библиотеку FreeImage и заголовок к ней из коллекции Цинна, а в Abf можно посмотреть AbhostFreeImage - оно как раз и занимается "подгрузкой картинки в массив"....


немного не то... нет задачи читать любые типы картинок. ББ ведь умеет открывать и сохранять bmp файлы. пытаюсь понять, как открыть bmp, что получу и потом уже в свое представление переведу...

в ObxBitmap идет работа через винапи, которого не знаю
в i21sysBitmaps есть ссылки на использование HostBitmaps, к которому нет документации

в хостбитмап есть ImportBitmap* (f: Files.File; OUT s: Stores.Store);
т.е. из файла получим представление картинки в Stores.Store? (со Stores пока не работал, но на него документация хоть есть)

Автор:  А.П. [ Пятница, 30 Ноябрь, 2012 09:04 ]
Заголовок сообщения:  Re: исполнитель для работы с изображениями

Пример программы работы с изображениями:
Код:
MODULE МоиИзображ1;
   IMPORT L := StdLog,  In,  Math, Gr := i21eduTPGraphics, F := i21eduFiles, Files;

   TYPE Arr = POINTER TO ARRAY OF ARRAY OF INTEGER;
   VAR pic, pic1 : Arr;

   PROCEDURE RdPx() : INTEGER;
      VAR a, b, c:SHORTCHAR; 
   BEGIN
      F.ReadSChar(a); F.ReadSChar(b); F.ReadSChar(c);
      RETURN ORD(c)+ORD(b)*256+ORD(a)*65536
   END RdPx;
   
   (* Процедура чтения картинки из файла *)
   PROCEDURE ReadPict(name: Files.Name; VAR pic: Arr);
      VAR  i, j, h, w : INTEGER; sc:SHORTCHAR; c:CHAR;
   BEGIN
      F.Close;
      F.Open(name);
      FOR i  := 1  TO 9   DO   (* пропуск ненужных байтов заголовка *)
         F.ReadChar( c );
      END;
      F.ReadInt( w );
      L.String('ширина=');L.Int(w);  (* ширина картинки, точек *)
      F.ReadInt(h );
      L.String('  высота='); L.Int(h);    (* высота картинки, точек *)
      pic := NIL;  NEW(pic, h,w);       
      FOR  i := 1  TO 14 DO   (* пропуск ненужных байтов заголовка *)
         F.ReadChar(c);
      END;
      
      FOR  i := 0  TO h-1   DO
      (* чтение троек байтов строки картинки *)
         FOR  j := 0  TO w-1   DO
            pic[h-1- i, j] := RdPx();
         END;
         (* пропуск выравнивающих байтов в конце строки *)
         j := 1;
         WHILE  j <= w*3 MOD 4   DO
            F.ReadSChar( sc ); INC( j )
         END;
      END;
      F.Close;
   END ReadPict;

   (* Процедура отрисовки картинки *)
   PROCEDURE Picture(x, y :INTEGER; pic: Arr);
      VAR  i, j : INTEGER;
   BEGIN
      FOR  i := 0  TO LEN(pic, 0)-1   DO
         FOR  j := 0  TO LEN(pic, 1)-1   DO
            Gr.color :=  pic[i, j];
            Gr.PutPixel(x + j, y + i);
         END;
      END;
   END Picture;   

   (* Процедура перевода картинки в цветной негатив *)
   PROCEDURE Negativ( pic: Arr; VAR pic1 : Arr);
      VAR  i, j, r, g, b, s : INTEGER;
   BEGIN
      NEW(pic1, LEN(pic, 0),  LEN(pic, 1));
      FOR  i := 0  TO LEN(pic, 0)-1   DO
         FOR  j := 0  TO LEN(pic, 1)-1   DO
            r := pic[i, j] MOD 256;
            g := pic[i, j] DIV 256 MOD 256;
            b := pic[i, j] DIV 256 DIV 256;
            pic1[i, j] := 255 - r + 256 * (255 - g) + 256 * 256 * ( 255 - b)
         END;
      END;
   END Negativ;

   (* Процедура масштабирования картинки *)
   PROCEDURE Scale(k :INTEGER; pic: Arr; VAR pic1 : Arr);
      VAR  i, j, m, n : INTEGER;
   BEGIN
      NEW(pic1, LEN(pic, 0)*k,  LEN(pic, 1)*k);
      FOR  i := 0  TO LEN(pic, 0)-1   DO
         FOR  j := 0  TO LEN(pic, 1)-1   DO
            FOR m := 0 TO k-1  DO
               FOR  n := 0  TO k-1   DO
                  pic1[i*k+m, j*k+n]:=pic[i, j]
               END;
            END;
         END;
      END;
   END Scale;

   (* Процедура поворота картинки *)
   PROCEDURE Rotate(VAR a, b: Arr; right: BOOLEAN);
      VAR  i, j : INTEGER;
   BEGIN
      b:= NIL;
      NEW(b, LEN(a, 1),  LEN(a,0));
      FOR  i := 0  TO LEN(a, 0)-1   DO
         FOR  j := 0  TO LEN(a, 1)-1   DO
            b[j, LEN(a, 0)-1-i]:=a[i,j]
         END;
      END;
   END Rotate;

   PROCEDURE Делать*;
      VAR i, j, p, w, h,b,re,g  : INTEGER;   c: CHAR; r: REAL;
         sc:SHORTCHAR;
         cc: ARRAY 100 OF CHAR;
         p1, p2, p3: Arr; ff : ARRAY 3 OF ARRAY 3 OF INTEGER;
      
   BEGIN
      Gr.Clear;
      Gr.bkColor := 255;
      ReadPict('LEGO 8885.bmp', p1);
      Picture(10, 10, p1);
      Negativ(p1, p2);
      Picture(200, 10, p2);
      Scale(2, p1, p2);
      Picture(10, 200, p2);
      Rotate(p1,  p2, TRUE);
      Picture(400, 10, p2);
      Gr.Open
   END Делать;

END МоиИзображ1.


Вложения:
Рисунок.png
Рисунок.png [ 62.52 КБ | Просмотров: 8294 ]

Автор:  ___ [ Пятница, 30 Ноябрь, 2012 12:27 ]
Заголовок сообщения:  Re: исполнитель для работы с изображениями

А.П. писал(а):
Пример программы работы с изображениями...

Спасибо!

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/