请教下,调大ppm图像

C++语言 码拜 6年前 (2015-05-11) 296次浏览 0个评论
 

请问下面的调整大小function哪里错了,输出出来的图片只有一片黑色:

void image::scaleImage(int factor)
{
	if((factor < 1) || (factor > 10))
	{
		cout << "Factor should be greater than 1 or less than 10" << endl;
		exit(0);
	}

	pixel *temp = NULL;
	temp = new(nothrow) pixel[xdim * factor * ydim * factor];
	if(temp == NULL)
	{
		cout << "Allocated failure." << endl;
		exit(1);
	}
	if(pixmap != NULL)
	{
		//for(int i = 0; i < xdim * factor * factor * ydim; i++)
			//temp[i] = pixmap[i/(xdim  * factor * factor) * xdim + i%(xdim * factor)/factor];

			int n = 0;
			for(int i = 0; i < ydim; i++)
			{
				for(int j = 0; j < factor; j++)
				{
					for(int k = 0; k < xdim * ydim; k++)
					{
						for(int m = 0; m < factor; m++)
						{
								temp[n++] = pixmap[k];
						}
					}
				}

			}
	}
	xdim *= factor;
	ydim *= factor;
	delete[] pixmap;
	pixmap = temp;
}

这是其他的function

#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <cstring>
#include "image.h"
using namespace std;


image::image()
{
	pixmap = NULL;
}

image::~image()
{
	if(pixmap != NULL)
		delete[] pixmap;
	pixmap = NULL;
}

void image::readImage(const char filename[])
{
	ifstream fin(filename, ios::binary);
	if(!fin)
	{
		cerr << "File cannot be opened." << endl;
		exit(1);
	}
	char temp[4];
	fin.read(temp,2);
	fin.ignore(1,""\n"");

	if(strcmp(temp, "P6") != 0)
	{
		fin.close();
		cerr << "There is an error in the file." << endl;
		exit(1);
	}

	char find = fin.peek();
	if(find == ""#"")
	{
		fin.ignore(100,""\n"");
	}

	fin >> xdim;
	fin >> ydim;

	fin.ignore(1,""\n"");
	fin.read(temp,3);
	fin.ignore(""\n"");

	pixmap = new(nothrow) pixel[xdim * ydim];

	if(pixmap == NULL)
	{
		fin.close();
		cout << "Allocated failure." << endl;
		exit(1);
	}
	else
	{
		image d;
		d.~image();
	}
	fin.read(reinterpret_cast<char*>(pixmap), xdim * ydim * sizeof(pixmap));


	fin.close();
}

void image::writeImage(const char filename[])
{
	ofstream fout(filename, ios::binary);
	if(!fout)
	{
		cerr << "File failed to open" << endl;
		exit(1);
	}

	fout.write("P6\n", 3);
	fout << xdim;
	fout.write("\t",1);
	fout << ydim;
	fout.write("\n255\n", 5);
	fout.write(reinterpret_cast<char*>(pixmap), xdim * ydim * sizeof(pixmap));

	fout.close();
}

void image::scaleImage(int factor)
{
	if((factor < 1) || (factor > 10))
	{
		cout << "Factor should be greater than 1 or less than 10" << endl;
		exit(0);
	}

	pixel *temp = NULL;
	temp = new(nothrow) pixel[xdim * factor * ydim * factor];
	if(temp == NULL)
	{
		cout << "Allocated failure." << endl;
		exit(1);
	}
	if(pixmap != NULL)
	{
		//for(int i = 0; i < xdim * factor * factor * ydim; i++)
			//temp[i] = pixmap[i/(xdim  * factor * factor) * xdim + i%(xdim * factor)/factor];

			int n = 0;
			for(int i = 0; i < ydim; i++)
			{
				for(int j = 0; j < factor; j++)
				{
					for(int k = 0; k < xdim * ydim; k++)
					{
						for(int m = 0; m < factor; m++)
						{

								temp[n++] = pixmap[k];
						}
					}
				}

			}
	}
	cout << endl;
	xdim *= factor;
	ydim *= factor;
	delete[] pixmap;
	pixmap = temp;
}

main.cpp:

#include <iostream>
#include <cstring>
#include "image.h"
using namespace std;

int main()
{
	char filename[64];
	image img;

	cout << "Picture file to read: ";
	cin.getline(filename, 64, ""\n"");
	img.readImage(filename);
	img.scaleImage(2);
	cout << "Picture file to write: ";
	cin.getline(filename, 64, ""\n"");
	img.writeImage(filename);

	return 0;

}
30分
建议用一个超小的图片比如5×4像素的图片作为测试图片,单步调试你的代码。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明请教下,调大ppm图像
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!