• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о проекте, чтобы узнать больше. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Необходимо написать программу сжимающую картинку

Kristi2012

Ученик
Регистрация
12 Фев 2012
Сообщения
2
Реакции
0
Баллы
0
Необходимо написать программу сжимающую картинку

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

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

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

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

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

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

Дело в том, что работа с графикой в разных версиях отличается, и то, что программа заработает в BP, не гарантирует, что она же без проблем запустится в FreePascal-е и уж, тем более, в PascalABC.
 
Ну вот, как вариант: сюжет "Серый Волк и Красная Шапочка". Сделано для Турбо-Паскаля, впрочем, графику там можно прицепить любую, алгоритм сохранится. Естественно, пути к файлам можно поменять. Также самостоятельно конфигурируйте параметры процедуры 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.
 

Вложения

  • INPUT.TXT
    INPUT.TXT
    1.5 KB · Просмотры: 599
  • Output.txt
    Output.txt
    407 байт · Просмотры: 585
  • WOLF01.webp
    WOLF01.webp
    5.3 KB · Просмотры: 69
  • WOLF02.webp
    WOLF02.webp
    2.6 KB · Просмотры: 59
да. и правда интересная программа. Вот почему нам не дают такого? вЛицее к примеру... хотя бы как факультатив...
 
Владимир, это же псевдографика, а топикстартеру надо сжать именно рисунок, скорее всего, формата bmp.
 
Владимир, это же псевдографика, а топикстартеру надо сжать именно рисунок, скорее всего, формата bmp.
Ну тогда это точно не мой уровень, а "высший пилотаж". Вы вроде как, помнится, с такими задачками возились. Я-то понял по-простому: есть входной файл Input.txt с нулями да единицами, и надо по определенному алгоритму соорудить выходной файл Output.txt, что я, собственно, и сделал. А графика - это так, просто иллюстрация для наглядности.
А Вы думаете, тут требуется BMP-изображения считывать, декодировать, ужимать и потом обратно преобразовывать? Тогда я точно - пас.
 
Владимир, это же псевдографика, а топикстартеру надо сжать именно рисунок, скорее всего, формата bmp.
В задании же написано
выходного файла Output.txt
и
входного файла Input.txt
значит все верно сделано :tehnari_ru_889:
тут требуется BMP-изображения считывать, декодировать, ужимать и потом обратно преобразовывать
В том то и прелесть формата bmp, что он без сжатия. Можно читать как бинарный файл, структура простая
 
В том то и прелесть формата bmp, что он без сжатия. Можно читать как бинарный файл, структура простая
"Ужимать" - в смысле применить указанный в задаче алгоритм.
 
Извиняюсь, не вчитался в задание. Вы совершенно правы, задание на псевдографику, просто вместо символов белых и черных прямоугольников по тексту 1 и 0.
 
Назад
Сверху