OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 19 Март, 2024 10:26

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
СообщениеДобавлено: Вторник, 27 Ноябрь, 2012 20:55 

Зарегистрирован: Четверг, 01 Июнь, 2006 11:14
Сообщения: 240
добрый день.

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

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

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

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

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


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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 28 Ноябрь, 2012 03:47 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Ещё смотрите в коллекции компонентов OberonCore подсистему Abf.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 28 Ноябрь, 2012 10:37 

Зарегистрирован: Четверг, 01 Июнь, 2006 11:14
Сообщения: 240
Илья Ермаков писал(а):
Ещё смотрите в коллекции компонентов OberonCore подсистему Abf.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 28 Ноябрь, 2012 20:27 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Точнее тогда, смотрите библиотеку FreeImage и заголовок к ней из коллекции Цинна, а в Abf можно посмотреть AbhostFreeImage - оно как раз и занимается "подгрузкой картинки в массив"....


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 29 Ноябрь, 2012 17:05 

Зарегистрирован: Четверг, 01 Июнь, 2006 11:14
Сообщения: 240
Илья Ермаков писал(а):
Точнее тогда, смотрите библиотеку FreeImage и заголовок к ней из коллекции Цинна, а в Abf можно посмотреть AbhostFreeImage - оно как раз и занимается "подгрузкой картинки в массив"....


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

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 30 Ноябрь, 2012 09:04 

Зарегистрирован: Пятница, 02 Декабрь, 2005 14:35
Сообщения: 210
Откуда: Россия, Томск
Пример программы работы с изображениями:
Код:
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 КБ | Просмотров: 8289 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 30 Ноябрь, 2012 12:27 

Зарегистрирован: Четверг, 01 Июнь, 2006 11:14
Сообщения: 240
А.П. писал(а):
Пример программы работы с изображениями...

Спасибо!


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB