Задать вопрос
@tj57

Как правильно парсить файл формата .pgm в C++?

Есть задача - создать пустой файл с изображением формата .pgm (просто белый фон) и нарисовать черным цветом линию с произвольными координатами. Это должен быть файл именно формата P5, содержащий биты, а не просто числа. Задача была реализована с использованием формата P2. Как обрабатывать файл с расширением P5? И можно ли так же использовать потоки ? Препод почему-то настойчиво предлагает использовать fprintf. Вот код :
#include "stdafx.h"

#include <iostream> 

#include <iomanip>

#include <fstream> 

#include <sstream>

using namespace std;

void drawLine(int** array, int x1, int y1, int x2, int y2) {
	const int deltaX = abs(x2 - x1);
	const int deltaY = abs(y2 - y1);
	const int signX = x1 < x2 ? 1 : -1;
	const int signY = y1 < y2 ? 1 : -1;
	//
	int error = deltaX - deltaY;
	//
	array[x2][y2] = 0;
	
	while (x1 != x2 || y1 != y2)
	{
		array[x1][y1] = 0;
		const int error2 = error * 2;
		//
		if (error2 > -deltaY)
		{
			error -= deltaY;
			x1 += signX;
		}
		if (error2 < deltaX)
		{
			error += deltaX;
			y1 += signY;
		}
	}

}


int main(void)
{
	ofstream fout;
	
	fout.open("E:\\line.pgm");

	fout.write("", 0);

	fout << "P2" << "\n" ;

	int numcols, numrows, x1, x2, y1, y2;

	cout << "Enter rows and columns number: ";

	cin >> numrows >> numcols;

	cout << "Enter coords x1 and y1: ";

	cin >> x1 >> y1;

	cout << "Enter coords x2 and y2: ";

	cin >> x2 >> y2;

	fout << numrows << " " << numcols << "\n";

	fout << 255 << "\n";

	int** array = new int*[numrows];

	for (int count = 0; count < numrows; count++)

		array[count] = new int[numcols];

	for (int i = 0; i < numrows; ++i) {

		for (int j = 0; j < numcols; ++j) {
			 array[i][j] = 255;
		}

	}

	drawLine(array, x1, y1, x2, y2);

	for (int i = 0; i < numrows; ++i) {

		for (int j = 0; j < numcols; ++j) {
			fout << array[i][j] << " ";
		}

	}

	fout.close();

}


Вот такой получился выходной файл в результате работы :

P2
100 100
255
255 255 0 0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255

и так далее.

P5 выглядит примерно так :


P5
# created by 'xv marcie_bw.tif'
#
#
640 480
255
’†tgbaaaaaaaccbbbbaabbdeimqruz~…Њ”њЎ¦ЁЁ¤ ћќќ ¦«Їіґµґіі°Ї®«¦џ—Ћ~qgba^]]_bgmqx{}~Ѓѓ€‘ Є«Јљ•љџЎџќ—‘€|ssy†•›њљ—“ЋЃnfjmlpruursx‰”ћ¤Ё©«Є©¤џ•Џ‹‹‰…ЃЃЃЃѓ††‚ЃЂ~|vroigfgggeegimy‡Џ•ќЎў¤ўЈ¤¦¦¤Ўќ™’‰‚{wwwwxxyyxyz{{{{|zywvttsqqqnjgeegiouѓ“ћ©±ё»»ѕАїїѕЅјАЖЙНОННЛЖАѕЅј»№·іЇЄўљђ€‚ЃЂЂЃѓ…ѓѓ††…ѓ††ѓ‚}}~~~~~}|zz|ѓ‘ќ§¬«Є©ЁЈ њ–’ЏЊЊђ–™™љ”ЏЉwtu{‚‰Ќ‘–љќќћќћџЎЈ«¶АИМСФФУТТУТРОНОПНОНЛЙЗБЅј№¶·є№¶¶і®­­ЇЇЇі±°
  • Вопрос задан
  • 190 просмотров
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы