Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
 Аватар для serёга
47 / 42 / 12
Регистрация: 27.08.2012
Сообщений: 290

Кодирование изображения

01.05.2013, 19:43. Показов 4124. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пытаюсь кодировать изображение. Суть следующая (у меня): считывание с пикселя структуры RGB. Дальше каждая из структур (R или G или B) кодируются соответственно по одному символу (согласно таблице ASCII). вроде всё норм. Тяжело поверить, что размер в байтах нашего изображения полностью равен исходному. Но обратный процесс не возможен. Т. к . есть символы повторяющиеся или например символ "nul" не считывается с файла. Тогда изображение выводится не правильно. У кого есть ещё какие-либо способы кодирования изображения (желательно с предварительным архивированием и, что бы можно было их декодировать)?

Добавлено через 20 часов 26 минут
Теория тоже подойдёт.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.05.2013, 19:43
Ответы с готовыми решениями:

Кодирование текста
Понимаю, что задача довольно простая, но не знаю, как ее решить. Входные данные: INPUT.TXT Выходные данные: OUTPUT.TXT Один из...

Перемешивание массива, кодирование.
помогите плиз решить задачку. Необходимо вывести на экран английский алфавит (большие и малые буквы), после этого перемешать их. затем...

Кодирование методом Хаффмана и Фано
Добрый день, не выполнить задание, Написать программу, которая осуществляет кодирование введенного текста методом Фано и Хаффмана ...

14
 Аватар для Nevermore_
74 / 74 / 30
Регистрация: 22.03.2013
Сообщений: 224
01.05.2013, 22:22
кодируй не текстом , а записью Green Red Blue
0
 Аватар для BaboshinSD
349 / 288 / 49
Регистрация: 15.11.2012
Сообщений: 477
Записей в блоге: 1
02.05.2013, 05:50
serёга, не совсем понятно, лучше если вы приведёте код. Как я понял вы считываете изображение по-пиксельно и записываете значение RGB в текстовый файл. Потом вы считываете изображение из файла, но оно не отрисовывается, так?
Цитата Сообщение от serёга Посмотреть сообщение
Дальше каждая из структур (R или G или B) кодируются соответственно по одному символу (согласно таблице ASCII)
Вроде в ASCII только коды клавиш.
0
 Аватар для serёга
47 / 42 / 12
Регистрация: 27.08.2012
Сообщений: 290
02.05.2013, 10:40  [ТС]
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#reference 'System.Drawing.DLL'
Var b: System.Drawing.Bitmap;
    i, j: integer;
    f: Text;
    c: System.Drawing.Color;
Begin
 
    b:= System.Drawing.Bitmap.Create('Image.png');
    Assign (f, 'Bitmap.bmap');
    Rewrite (f);
    Writeln (f,b.Width,' ',b.Height);
    For j:=1 to b.Height-1 do
    For i:=1 to b.Width-1 do 
       Begin
    
        c:=b.GetPixel (i, j);
        Write (f, char(c.R), char(c.G), char( c.B));
       End;     
 
   Close (f);
 
 
End.
Рядом с exe должен находиться Image.png
0
 Аватар для BaboshinSD
349 / 288 / 49
Регистрация: 15.11.2012
Сообщений: 477
Записей в блоге: 1
02.05.2013, 11:01
serёга, не знаю как у вас, но у меня в файле абракадабра. Поигрался с кодировками, не помогло. Помог такой вариант:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{$reference 'System.Drawing.dll'}
var
  b: System.Drawing.Bitmap;
  i, j: integer;
  f: Text;
  c: System.Drawing.Color;
 
begin
  b := System.Drawing.Bitmap.Create('BackGround.png');
  Assign(f, 'Bitmap.txt');
  Rewrite(f);
  Writeln(f, b.Width, ' ', b.Height);
  for j := 1 to b.Height - 1 do
    for i := 1 to b.Width - 1 do 
    begin     
      c := b.GetPixel(i, j);
      Write(f, c.R.ToString, ' ', c.G.ToString, ' ', c.B.ToString, ' : ');
    end; 
  Close(f); 
end.
Заменил функцию Char на ToString, остальное добавил для удобство чтения (человеку). Теперь нужно просто считывать файл по-символьно, вот примерный алгоритм:

1. Открыть файл на чтение
2. Считать до пробела и присвоить это значение R-значению цвета
3. Считать до пробела и присвоить это значение G-значению цвета
4. Считать до пробела и присвоить это значение B-значению цвета
5. Пропустить пробел и двоеточие
6. Повторять до конца файла

Можно в принципе заменить разделители (пробелы и двоеточия) чем-то более удобным для парсинга.
1
 Аватар для serёга
47 / 42 / 12
Регистрация: 27.08.2012
Сообщений: 290
02.05.2013, 19:04  [ТС]
Вот только интересно, почему b.Height-1 и b.Width-1 почему нельзя последние ряды пикселей считать. И как их записать вообще?
0
 Аватар для serёга
47 / 42 / 12
Регистрация: 27.08.2012
Сообщений: 290
05.05.2013, 17:13  [ТС]
Попробовал сделать декодировщик, но у меня не чего не получилось.
Вот: Decoder.rar

Может подредактируете.
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
05.05.2013, 18:08
Тип Text как бы намекает, что он для текстовых файлов. Как насчёт file?
0
 Аватар для serёга
47 / 42 / 12
Регистрация: 27.08.2012
Сообщений: 290
05.05.2013, 21:49  [ТС]
Тогда Readln (f, c) - выдаёт ошибку, нельзя считать с этого типа.

Добавлено через 3 часа 14 минут
А всё догадался.
Вместо строки Read (f, w, h); нужно вставить код:
Pascal
1
2
3
Readln (f, c); 
   var g:= UnZip (c);
   w:=g.R; h:=g.G;
а в файл добавить в первую строку один пробел и цифру 0
0
 Аватар для BaboshinSD
349 / 288 / 49
Регистрация: 15.11.2012
Сообщений: 477
Записей в блоге: 1
06.05.2013, 10:56
serёга, всё намного проще) Вот:
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
{reference 'System.Drawing.dll'}
uses
  GraphABC;
 
var
  f: Text;
  c: string;
  s: char;
  w, h: integer;
 
function UnZip(n: string): System.Drawing.Color;
var
  i, p, j: integer;
  RGB: array [1..3] of string;
begin
  if n = 'A' then begin RGB[1] := '0'; RGB[2] := '0'; RGB[3] := '0'; end
  
  else 
    for i := 1 to n.Length do
    begin
      if n[i] = ' ' then Inc(p);    // Счётчик пробелов
      for j := 0 to 2 do
      begin
        if p = j then 
        begin
          case n[i] of
            'M': RGB[j + 1] := '255';
            'X': RGB[j + 1] := '200';
          
          else RGB[ j + 1] += n[i];
          end;
        end;
      end;
    end;
  
  Result := Color.FromArgb(StrToInt(RGB[1]), StrToInt(RGB[2]), StrToInt(RGB[3]));
end;
 
begin
  Assign(f, 'Bitmap.mbp');
  Reset(f);
  ReadLn(f, w, h); // Делаем переход на новую строку
  for var j := 1 to h - 1 do
    for var i := 1 to w - 1 do
    begin
      Readln(f, c);
      SetPixel(i, j, UnZip(c));
    end;
  Close(f);
end.
Изменения закомментировал + избавился от не нужных переменных.
Вложения
Тип файла: zip Decoder.zip (12.9 Кб, 16 просмотров)
1
 Аватар для BaboshinSD
349 / 288 / 49
Регистрация: 15.11.2012
Сообщений: 477
Записей в блоге: 1
06.05.2013, 13:15
Вот решил протестить программу и заметил интересную особенность: файл, созданный с изображения .jpg отличается от файлов, созданных из таких же изображений в формате .bmp, .png и .gif. Результаты во вложении.

Не по теме:

Ещё бы придумать способ сжатия .txt файла и новый формат изображения готов :)

0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
06.05.2013, 15:07
Цитата Сообщение от BaboshinSD Посмотреть сообщение
файл, созданный с изображения .jpg отличается от файлов, созданных из таких же изображений в формате .bmp, .png и .gif.
Кто бы сомневался... Jpg с потерями сжимает. Сделай больше 256 цветов, тогда и gif отличаться будет.
1
 Аватар для BaboshinSD
349 / 288 / 49
Регистрация: 15.11.2012
Сообщений: 477
Записей в блоге: 1
06.05.2013, 16:52
Somebody, т.е. изображение .jpg по цветам отличается от других (например .bmp), просто "на глаз" этого не видно?
0
 Аватар для serёга
47 / 42 / 12
Регистрация: 27.08.2012
Сообщений: 290
06.05.2013, 16:52  [ТС]
Где-то читал, что формат jpg сходен с форматом tiff, но как они кодируются, понятия не имею. И кстати про новый формат изображения. Этот формат кодируется не полностью. Не хватает ряда пикселей справа и снизу. т.к. при кодирование у нас b.Width-1 и b.Height-1. Странно, но если убрать единицы то отладчик выдаёт ошибку, типа параметр должен быть положительным или меньше ширины/высоты объекта. Но счётчик начинается с 0.

Но и это изображение нужно по максимуму сжать, зашифровать.
0
 Аватар для serёга
47 / 42 / 12
Регистрация: 27.08.2012
Сообщений: 290
06.05.2013, 17:19  [ТС]
Вот вся работа:Decoder.rar

Изображение конвертируется на 100 % ну если не учитывать Альфа.
И есть небольшой встроенный архиватор (не доделанный но суть есть). Полученный mbp-формат на 3 Кб меньше чем без архивирования (только исходное изображение 64 X 64)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.05.2013, 17:19
Помогаю со студенческими работами здесь

Кодирование методом контроля четности
Задание: Кодирование методом контроля чётности. Вводится k - число символов в блоке и последовательность двоичных символов, длина которой...

Задача про кодирование текста
Помогите решить данную задачу: Закодировать текст по следующему правилу: закодированная буква получается из исходной буквы путем...

Кодирование методом Шеннона-Фано и Хаффмана
Добрый день уважаемые форумчане, не могу выполнить задание по дискретной математике, нужно написать программу которая будет кодировать...

Задача по теме:Кодирование и декодирование информации
Я в информатике ни бум-бум... а очень нужна программа, точнее две программы: 1) Программа, которая кодирует и декодирует буквы...

Кодирование заданного слова азбукой Морзе
Напишите программу, кодирующую слово введенное пользователем азбукой морзе


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru