Технический форум

Технический форум (http://www.tehnari.ru/)
-   Delphi, Kylix and Pascal (http://www.tehnari.ru/f43/)
-   -   Необходимо написать программу сжимающую картинку (http://www.tehnari.ru/f43/t64023/)

Kristi2012 12.02.2012 21:29

Необходимо написать программу сжимающую картинку
 
Одной из самых часто встречаемых задач в информатике является задача сжатия данных. Рассмотрим частный случай этой проблемы, а именно — сжатие черно-белых изображений, каждое из которых представляет собой набор пикселей черного и белого цвета. Сжатие такого рисунка происходит следующим образом: изначально набор пикселей разбивается на квадраты размером два на два. Каждый такой квадрат является пикселем нового сжатого изображения, причем он окрашен в черный цвет, если хотя бы два пикселя в исходном квадрате окрашены в черный, и в белый в противном случае. Вам необходимо написать программу, сжимающую картинку.
Формат входного файла

В первой строке входного файла Input.txt находятся два натуральных числа w, h — ширина и высота исходного изображения в пикселях. (1 ≤ w, h ≤ 100). Гарантируется, что во входных тестах оба числа четные. Следующие h строк входного файла содержат по w чисел, каждое из которых равно либо 0, если этот пиксель белый, либо 1, если пиксель — черный.
Формат выходного файла

В первой строке выходного файла Output.txt требуется вывести два числа W, H — ширину и высоту сжатого изображения. Следующие H cтрок должны содержать по W чисел — описание сжатого изображения, в формате, аналогичном формату входного файла.

Kristi2012 12.02.2012 21:31

Цитата:

Сообщение от Kristi2012 (Сообщение 674563)
Одной из самых часто встречаемых задач в информатике является задача сжатия данных. Рассмотрим частный случай этой проблемы, а именно — сжатие черно-белых изображений, каждое из которых представляет собой набор пикселей черного и белого цвета. Сжатие такого рисунка происходит следующим образом: изначально набор пикселей разбивается на квадраты размером два на два. Каждый такой квадрат является пикселем нового сжатого изображения, причем он окрашен в черный цвет, если хотя бы два пикселя в исходном квадрате окрашены в черный, и в белый в противном случае. Вам необходимо написать программу, сжимающую картинку.
Формат входного файла

В первой строке входного файла Input.txt находятся два натуральных числа w, h — ширина и высота исходного изображения в пикселях. (1 ≤ w, h ≤ 100). Гарантируется, что во входных тестах оба числа четные. Следующие h строк входного файла содержат по w чисел, каждое из которых равно либо 0, если этот пиксель белый, либо 1, если пиксель — черный.
Формат выходного файла

В первой строке выходного файла Output.txt требуется вывести два числа W, H — ширину и высоту сжатого изображения. Следующие H cтрок должны содержать по W чисел — описание сжатого изображения, в формате, аналогичном формату входного файла.

Извините на Паскале, пытаюсь сама разбираться в программирование. Летом в ВУЗ буду поступать, спасибо заранее

AlexZir 13.02.2012 13:09

Задание достаточно интересное и нестандартное. Под какую именно версию Pascal вам нужно решение?

Дело в том, что работа с графикой в разных версиях отличается, и то, что программа заработает в BP, не гарантирует, что она же без проблем запустится в FreePascal-е и уж, тем более, в PascalABC.

Vladimir_S 13.02.2012 18:55

Вложений: 4
Ну вот, как вариант: сюжет "Серый Волк и Красная Шапочка". Сделано для Турбо-Паскаля, впрочем, графику там можно прицепить любую, алгоритм сохранится. Естественно, пути к файлам можно поменять. Также самостоятельно конфигурируйте параметры процедуры InitGraph. Цвета у меня инвертированы, поскольку используется черный DOS-экран. И еще - для наглядности каждая точка - это квадрат экрана 10х10 пикселей.
Код:

Uses Graph,CRT;
Var
 A,B:Array[1..100,1..100] of byte;
 M,N,i,j,k,l:Byte;
 X0,Y0,X,Y:Word;
 f:Text;
 C:Char;
 Code:Integer;
BEGIN
 Assign(f,'D:\Input.txt');
 Reset(f);
 Readln(f,N,M);
 For i:=1 to M do
  Begin
  For j:=1 to N do
    begin
    Read(f,C);
    Val(C,A[i,j],Code);
    end;
  Readln(f);
  End;
 Close(f);
 InitGraph(...);
 ClearDevice;
 X0:=(GetMaxX-N*10) div 2;
 Y0:=(GetMaxY-M*10) div 2;
 For i:=1 to M do
  For j:=1 to N do
  For k:=0 to 9 do
    For l:=0 to 9 do
    Begin
      X:=X0+j*10+k;
      Y:=Y0+i*10+l;
      If A[i,j]=0 then
      PutPixel(X,Y,Black)
      else
      PutPixel(X,Y,White);
    End;
 ReadKey;
 Assign(f,'D:\Output.txt');
 Rewrite(f);
 N:=N div 2;
 M:=M div 2;
 Writeln(f,N,' ',M);
 For i:=1 to M do
  Begin
  For j:=1 to N do
    begin
    B[i,j]:=A[2*i-1,2*j-1]+A[2*i,2*j-1]+A[2*i-1,2*j]+A[2*i,2*j];
    If B[i,j]>1 then B[i,j]:=1 else B[i,j]:=0;
    Write(f,B[i,j]);
    end;
  Writeln(f);
  End;
 Close(f);
 ClearDevice;
 X0:=(GetMaxX-N*10) div 2;
 Y0:=(GetMaxY-M*10) div 2;
 For i:=1 to M do
  For j:=1 to N do
  For k:=0 to 9 do
    For l:=0 to 9 do
    Begin
      X:=X0+j*10+k;
      Y:=Y0+i*10+l;
      If B[i,j]=0 then
      PutPixel(X,Y,Black)
      else
      PutPixel(X,Y,White);
    End;
 ReadKey;
END.


kreol 13.02.2012 22:58

да. и правда интересная программа. Вот почему нам не дают такого? вЛицее к примеру... хотя бы как факультатив...

AlexZir 14.02.2012 04:16

Владимир, это же псевдографика, а топикстартеру надо сжать именно рисунок, скорее всего, формата bmp.

Vladimir_S 14.02.2012 09:54

Цитата:

Сообщение от AlexZir (Сообщение 675565)
Владимир, это же псевдографика, а топикстартеру надо сжать именно рисунок, скорее всего, формата bmp.

Ну тогда это точно не мой уровень, а "высший пилотаж". Вы вроде как, помнится, с такими задачками возились. Я-то понял по-простому: есть входной файл Input.txt с нулями да единицами, и надо по определенному алгоритму соорудить выходной файл Output.txt, что я, собственно, и сделал. А графика - это так, просто иллюстрация для наглядности.
А Вы думаете, тут требуется BMP-изображения считывать, декодировать, ужимать и потом обратно преобразовывать? Тогда я точно - пас.

Rossomaxa 14.02.2012 10:36

Цитата:

Сообщение от AlexZir (Сообщение 675565)
Владимир, это же псевдографика, а топикстартеру надо сжать именно рисунок, скорее всего, формата bmp.

В задании же написано
Цитата:

Сообщение от Kristi2012 (Сообщение 674563)
выходного файла Output.txt

и
Цитата:

Сообщение от Kristi2012 (Сообщение 674563)
входного файла Input.txt

значит все верно сделано :tehnari_ru_889:
Цитата:

Сообщение от Vladimir_S (Сообщение 675594)
тут требуется BMP-изображения считывать, декодировать, ужимать и потом обратно преобразовывать

В том то и прелесть формата bmp, что он без сжатия. Можно читать как бинарный файл, структура простая

Vladimir_S 14.02.2012 10:40

Цитата:

Сообщение от Rossomaxa (Сообщение 675606)
В том то и прелесть формата bmp, что он без сжатия. Можно читать как бинарный файл, структура простая

"Ужимать" - в смысле применить указанный в задаче алгоритм.

AlexZir 14.02.2012 14:28

Извиняюсь, не вчитался в задание. Вы совершенно правы, задание на псевдографику, просто вместо символов белых и черных прямоугольников по тексту 1 и 0.


Часовой пояс GMT +4, время: 21:29.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.