Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 10.04.2017
Сообщений: 7

Работа с нетипизированным BMP файлом

26.05.2017, 01:47. Показов 1323. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, хотел бы попросить помощи по заданию, так как не понимаю как сделать его через нетипизированный без использования GraphABC.

Условие:

Кликните здесь для просмотра всего текста
Перевести изображение в градации серого. После этого разбить изображение на блоки размером 5х5. К каждому отсчету блока прибавить число с соответствующими координатами из матрицы:

40 60 150 90 10
80 170 240 200 110
140 210 250 220 130
120 190 230 180 70
20 10 160 50 30

Результирующее изображение перевести в двуцветное (черно-белое). Исходное изображение цветное (8 бит).


Я понял то, что так как дано изображение BMP, то его палитра начинается с 54 байта. Очень нужно сделать, но я не знаю пока что как. Буду рад любой помощи. Заранее спасибо за ответы!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.05.2017, 01:47
Ответы с готовыми решениями:

Работа с нетипизированным файлом
Создать файл, компоненты (количество <=9) которого являются вещественными числами. После создания файла поменять местами значения...

Работа с нетипизированным файлом
Всем привет! Есть задача по шифрованию фалов. Она выполнена на 70 процентов. т.е. я шифрую файл как мне надо, на выходе получаю...

Работа с BMP файлом
считывание с файла в масивpublic: int *loadBMP( const char *fname, int &mx, int &my ) { int *v; mx = my = -1; FILE *f =...

3
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,059
26.05.2017, 06:42
Ну, я могу понять ограничение — не использовать GraphABC.
Но, ведь можно использовать системные библиотеки самой винды.
Ведь bmp — это родная картинка данной системы!

Вот пример работы с BMP:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
{$reference 'System.Drawing.dll'}
uses
  System.Drawing;
begin
  var BMP := System.Drawing.Bitmap.Create(10, 10);
  for var x : Byte := 0 to 9 do
    for var y : Byte := 0 to 9 do
      begin
        var c := System.Drawing.Color.FromArgb((x+y)*2, 255, 0, 0);
        BMP.SetPixel(x, y, c);
      end;
  BMP.Save('GradIcon.bmp', System.Drawing.Imaging.ImageFormat.Bmp);
end.
Обратное — см. мой второй ответ в теме: В bmp-файле найти максимальную интенсивность каждой компоненты цвета

Ну, а если всё-же хотите поизвращаться, то можно было воспользоваться поиском:
Изображение BMP-файла
0
0 / 0 / 0
Регистрация: 10.04.2017
Сообщений: 7
27.05.2017, 22:59  [ТС]
JuriiMW, суть в том, что мне нужно именно использовать побайтовый способ, чтением байтов и в дальнейшем их изменение.
http://pascal.sources.ru/articles/099.htm Вот тут примерно то, что мне нужно, но оно не работает с указателями. Я не знаю почему.

Добавлено через 10 часов 18 минут
Спасибо, все уже сделал сам.
0
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,059
30.05.2017, 09:50
Вот и я сделал как пример для работы с 2-х, 256-ти и полноцветными изображениями:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
uses GraphABC;
 
const name = '2.bmp'; 
 
function DWord(n:cardinal; b:array of Byte) := cardinal(b[n]) +
  cardinal(b[n+1]) shl 8 + cardinal(b[n+2]) shl 16 + cardinal(b[n+3]) shl 24;
 
function oWord(n:word; b:array of Byte) := word(b[n]) + word(b[n+1]) shl 8;
 
procedure GetBMP;
begin
  var b := System.IO.File.ReadAllBytes(name);
  //========== BitMapFileHeader (14 байт) ======================================
  WriteLn('BitMapFileHeader (14 байт)');
  // Заголовочные символы Word : bfType = "BM" (0,1)
  var bfType := Chr(b[0]) + Chr(b[1]); WriteLn('bfType=', bfType);
  if bfType <> 'BM' then begin WriteLn('error bfType'); Exit; end;
  // Общий размер файла DWord : bfSize (2,3,4,5)
  var bfSize := DWord(2,b); WriteLn('bfSize=', bfSize);
  if bfSize <> b.Length then begin WriteLn('error bfSize'); Exit; end;
  // Не используется (6,7,8,9)
  // Адрес битового массива DWord : bfOffBits (10,11,12,13)
  var bfOffBits := DWord(10,b); WriteLn('bfOffBits=', bfOffBits);
  //========== BitMapInfoHeader ================================================
  WriteLn('BitMapInfoHeader'); // Не обязательно, но чаще всего 40 байт
  // Размер данной структуры DWord : biSize = 40 (14,15,16,17)
  var biSize := DWord(14,b); WriteLn('biSize=', biSize);
  if biSize <> 40 then begin WriteLn('error biSize'); Exit; end;
  // Ширина растра в пикселях Long : biWidth (18,19,20,21)
  var biWidth := DWord(18,b); WriteLn('biWidth=', biWidth);
  // Высота растра в пикселях Long : biHeigth (22,23,24,25)
  var biHeigth := DWord(22,b); WriteLn('biHeigth=', biHeigth);
  // Должно быть равным 1 - Word : biPlanes (26,27)
  var biPlanes := oWord(26,b); WriteLn('biPlanes=', biPlanes);
  if biPlanes <> 1 then begin WriteLn('error biPlanes'); Exit; end;
  // Бит на пиксел (1,4,8,16,24,32) - Word : biBitCount (28,29)
  var biBitCount := oWord(28,b); WriteLn('biBitCount=', biBitCount);
  if arr(1,4,8,16,24,32).IndexOf(biBitCount) < 0 then begin WriteLn('error biBitCount'); Exit; end;
  // Равно нулю DWord : biCompression (30,31,32,33)
  var biCompression := DWord(30,b); WriteLn('biCompression=', biCompression);
  if biCompression <> 0 then begin WriteLn('error biCompression'); Exit; end;
  // Размер в байтах не сжатого битового массива DWord : biSizeImage (34,35,36,37)
  var biSizeImage := DWord(34,b); WriteLn('biSizeImage=', biSizeImage);
  if biSizeImage <> 0 then begin WriteLn('error biSizeImage'); Exit; end;
  // Разрешение по X в пикселах на метр Long : biXPelsPerMeter (38,39,40,41)
  // Разрешение по Y в пикселах на метр Long : biYPelsPerMeter (42,43,44,45)
  // Количество используемых цветов (0 - все) DWord : biClrUsed (46,47,48,49)
  // DWord : biClrImportant (50,51,52,53)
  WriteLn('----------');
  
  case biBitCount of
    1  : // Двухцветное
      begin
        var adr := 14 + biSize; // Начальный адрес палитры
        WriteLn(adr, ':');
        var c : array of Color;
        SetLength(c, 2);
        for var i := 0 to 2 do
          begin
            c[i] := rgb(b[adr+2], b[adr+1], b[adr+0]);
            WriteLn(b[adr+2], #32, b[adr+1], #32, b[adr+0]);
            adr += 4;
          end;
        adr := bfOffBits; // Начальный адрес изображения
        for var Y := biHeigth-1 downto 0 do
          begin
            var d : Byte := 0;
            var r : Byte := 0;
            var u : Byte := 0;
            var X := 0;
            repeat
              if d = 0 then
                begin
                  d := $80;
                  r := 7;
                  u := b[adr]; adr += 1;
                end;
              PutPixel(200+X, Y, c[(u and d) shr r]);
              r -= 1; d := d shr 1; X += 1;
            until X = biWidth;
            while adr mod 4 <> 2 do
              adr += 1;
          end;
      end;
    8  : // 256 цветов
      begin
        var adr := 14 + biSize; // Начальный адрес палитры
        var c : array of Color;
        SetLength(c, 256);
        for var i := 0 to 255 do
          begin
            c[i] := rgb(b[adr+2], b[adr+1], b[adr+0]);
            adr += 4;
          end;
        adr := bfOffBits; // Начальный адрес изображения
        for var Y := biHeigth-1 downto 0 do
          begin
            var X := 0;
            repeat
              PutPixel(200+X, Y, c[b[adr]]);
              adr += 1;
              X += 1;
            until X = biWidth;
          end;
      end;
    24 : // Без палитры 3 байта
      begin
        var adr := bfOffBits; // Начальный адрес изображения
        for var Y := biHeigth-1 downto 0 do
          begin
            var X := 0;
            repeat
              PutPixel(200+X, Y, rgb(b[adr+2], b[adr+1], b[adr+0]));
              adr += 3;
              X += 1;
            until X = biWidth;
          end;
      end;
    32 : // Без палитры 4 байта
      begin
        var adr := bfOffBits; // Начальный адрес изображения
        for var Y := biHeigth-1 downto 0 do
          begin
            var X := 0;
            repeat
              PutPixel(200+X, Y, rgb(b[adr+2], b[adr+1], b[adr+0]));
              adr += 4;
              X += 1;
            until X = biWidth;
          end;
      end;
  else
    WriteLn('Палитра: ', biBitCount);
  end; // case
end;
 
begin
  GetBMP;
end.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.05.2017, 09:50
Помогаю со студенческими работами здесь

Работа с BMP файлом.
Помогите, с чего начать? Требуется написать программу, которая открывает файл bmp и заменяет в нём каждый 10 байт на байты из текстового...

Работа с BMP файлом
Доброго всем дня. Мне нужно сделать приложение которое будет работать с BMP рисунком. То есть суть программки приблизительно такая: 1....

Простейшая работа с BMP-файлом
Добрый день! Только начал работать с Python, версия 3.4,разбираюсь. Пробую для начала окрасить пиксель в bmp-файле, но возникают проблемы...

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

Работа с bmp файлом. Считывание значение пикселей в массив
Здравствуйте. Необходимо написать код который считывает из bmp картинки значение пикселей RGB в массив. Спасибо за внимание!


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru