2015-03-18 4 views
-1

Как домашнее задание, мы должны читать в .pgm-файле, а затем рисовать квадрат, изменяя значения пикселей, а затем выводить новое изображение. После того как я перейду и изменим пиксели, я распечатаю их все на .txt, чтобы проверить, что они действительно добавлены. У меня возникла проблема с записью нового файла. Я знаю, что он должен быть двоичным, поэтому после googling я думаю, что должен использовать DataOutputStream, но я мог ошибаться. После того, как я напишу файл, его размер составляет 1,9 МБ, где, поскольку оригинал составляет всего 480 КБ, так что сразу с места в карьер я подозреваю, что что-то должно быть неправильным. Любые советы или советы для написания файлов .pgm были бы замечательными!Чтение и запись файла PGM

public static void writeImage(String fileName) throws IOException{ 
    DataOutputStream writeFile = new DataOutputStream(new FileOutputStream(fileName)); 
    // Write the .pgm header (P5, 800 600, 250) 
    writeFile.writeUTF(type + "\n"); 
    writeFile.writeUTF(width + " " + height + "\n"); 
    writeFile.writeUTF(max + "\n"); 

    for(int i = 0; i < height; i++){ 
     for(int j = 0; j < width; j++){ 
      writeFile.writeByte(img[i][j]); //Write the number 
      writeFile.writeUTF(" "); //Add white space 
     } 
     writeFile.writeUTF(" \n"); //finished one line so drop to next 
    } 
    writeFile.close(); 

} 

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

+0

Вы прочитали [Учебник Java по потокам байтов] (http://docs.oracle.com/javase/tutorial/essential/io/bytestreams.html)? –

+0

@Obicere «мы должны читать в файле .pgm». Вопрос в том, является ли исходный файл двоичным или ASCII. –

+0

@Obicere Исходный файл .pgm file – John

ответ

0

Неправильно использовать метод writeByte для записи пикселя. writeByte будет писать один байт, даже если аргумент имеет тип int. (записаны восемь младших бит аргумента).

Необходимо внимательно прочитать спецификацию формата файла и убедиться, что вы записываете правильное количество байтов. Шестигранный редактор может многое помочь.

+0

True. Я мог бы использовать writeChar, потому что он записывает int с 2 байтами, и каждый пиксель составляет 1 или 2 байта, правильно? Будет ли использовать writeUTF через него, или нет, потому что theres разрешало несколько пробелов между ними? Или я просто совершенно не прав, и dataOutputStream - это не путь – John

+0

Я не знаю подробностей этого формата, но обычно один пиксель составляет 4 байта (красный, зеленый, синий и, возможно, альфа-канал) – lbalazscs

+0

@lbalazscs PGM это Portable * Gray * Map. Таким образом, пиксель всегда равен 1 или 2 байтам (2 байта для 16 бит или 'max> 255'). Нет R, G, B или A. :-) – haraldK

0

Я думаю, что вы каким-то образом смешиваете двоичные (P5) и ASCII (P2) режимы формата PGM.

Версия ASCII имеет пробелы между пикселями и (необязательными) линиями, как в вашем коде.

Для двоичного формата вы должны просто написать значения пикселей (как байты, так как у вас максимальное значение 250). Нет пробелов или строк.

(я не пишу код для вас, так как это задание, но вы почти там, поэтому я уверен, что вы будете делать это :-)

PS: Кроме того, внимательно прочитайте документация на DataOuputStream.writeUTF(...):

Сначала два байта записываются в выходной поток, как если бы методом writeShort указывалось количество байтов.

Вы уверены, что это то, что вы хотите? Имейте в виду, что заголовки формата PGM - это ASCII, поэтому здесь нет необходимости использовать UTF.

Смежные вопросы