Показать сообщение отдельно
Старый 11.11.2009, 14:10   #13
Tronix
Знающий
 
Регистрация: 26.07.2009
Адрес: Россия, Москва
Сообщений: 318
Написано 103 полезных сообщений
(для 331 пользователей)
Ответ: К вопросу о сжатии черно-белого изображения

Ребят, есть интересные идеи, спасибо. Буду думать, сейчас вообще запутался со своим алгоритмом, наверное буду заново все переписывать.

И еще, вдруг кто-то тоже захочет размять мозги, поэтому предлагаю мини-конкурс -)) Победителю - всяческие регардсы и гридзы )))

Дано:
1) файл numbers.bin, содержащий в себе изображения 10-ти символов. Каждый символ имеет размерность 28x28 пикселей. Каждый пиксель занимает в файле 1 байт и значение этого байта указывает на цвет пикселя. Учесть, что если байт равен 0 - то цвет пикселя череый, если больше нуля - белый.
2) простейшая программа на Turbo/Borland/Virtual/Free Pascal'е, которая отображает на экране в текстовом виде любой из 10 символов из вышеописанного файла. Программа - просто для лучшего понимания формата файла.

Задание:
1) Преобразовать исходный файл numbers.bin в другой файл с минимальным размером. Учесть, что простым преобразованием оригинального файла в битовое представление (8 пикселей = 1 байт, 28x28=784 байт / 8 бит =>98 байт) каждый символ занимает 98 байт, а файл - 98x10 символов = 980 байт. Таким образом, получившийся выходной файл должен быть меньше 980 байт.
2) Написать простую программу, которая работает с получившемся ужатым файлом и позволяет вывести на экран любой из 10 символов.

Вышеобозначенная програмка:
Const
      
num 0;        {Номеp символакотоый нужно вывестиот 0 до 9}
Var
      
f     File;
      
buf   : Array [1..28,1..28of Byte; {Массив для одного символа}
      
x,
      
y     Byte;     {Пеpеменные циклов по x и по y}

Begin
      assign
(f,'numbers.bin');
      
reset(f,1);                   {Откpываем файл}
      If 
IOResult <> 0 then         {Если файл не найден}
            
Begin                   {Выводим сообщение об ошибке}
                  
Writeln('File numbers.bin not found');
                  
Halt(1);          {и завеpшаем погpамму}
            
End;

      
Seek(f,784*num);              {Смещаемся по файлу к нужному символу}
      
BlockRead(f,buf,784);         {Читаем 28x28 байт в буффеp}
      
close(f);                     {Закываем файл}

      For 
:= 1 to 28 do           {Двигаемся по стокам}
        
Begin
            
For := 1 to 28 do     {Двигаемся по столбцам}
                  If 
Buf[x,y] > 0 then {Если байт больше 0значит}
                        
Write('1')     {это белый цветвыводим 1}
                  else
                        
Write(' ');    {Если pавен нулю цеpный цвет}
            
WriteLn;            {После завешения pисования стоки}
                                {
пеpеводим куpсоp на следующую стоку}
        
End;
      
WriteLn('Press ENTER to exit...');  {Что-бы окно не сазу закывалось}
      
ReadLn;                             {Ждем нажатия ENTER}
End
В архиве файл numbers.bin, простейшая програмка для просмотра файла numbers.bin.
Вложения
Тип файла: zip test_fnt.zip (9.5 Кб, 4253 просмотров)
(Offline)
 
Ответить с цитированием