Question
Using the 3 files below, edit the C++ functions that will manipulate a 600x600 image. The original image should be resized twice, down to both
Using the 3 files below, edit the C++ functions that will manipulate a 600x600 image.
The original image should be resized twice, down to both 400x400 and 200x200 atop the newly created 600x600 P6 image. The function prototype for the resizings should be: void resizeImage(image_t*, image_t* );
***************************************
// driver.c //
#include
#include
#include "ppm_info.h"
int main(int argc, char* argv[])
{
if(argc != 4)
{
printf("USAGE: ");
return -1;
}
FILE* originalImage = fopen(argv[1], "r");
FILE* newImage = fopen(argv[2], "w");
FILE* newImageP3 = fopen(argv[3], "w");
if(!originalImage || !newImage || !newImageP3)
{
printf("ERROR: File(s) could not be opened. ");
return -1;
}
image_t* image = read_ppm(originalImage);
header_t hdr = {"P6", 600, 600, 255};
image_t* imageNew = allocate_memory(hdr);
resizeImage(image, imageNew);
write_p6(newImage, imageNew);
//write_p6(newImage, image);
//write_p3(newImageP3, image);
return 0;
}
******************************************************************
// ppm_info.c //
#include "ppm_info.h"
header_t read_header(FILE* image_file)
{
header_t header;
fscanf(image_file, "%s %d %d %d ",
header.magicNum, &header.width, &header.height, &header.maxVal);
return header;
}
void write_header(FILE* out_file, header_t header)
{
fprintf(out_file, "%s %d %d %d ",
header.magicNum, header.width, header.height, header.maxVal);
}
image_t* read_ppm(FILE* image_file)
{
header_t header = read_header(image_file);
image_t* image = NULL;
image = read_pixels(image_file, header);
return image;
}
image_t* read_pixels(FILE* image_file, header_t header) {
int row = 0;
int col = 0;
unsigned char red,green,blue;
red = green = blue = 0;
image_t* image= allocate_memory(header);
for(row = 0; row < header.height; row++)
{
for(col = 0; col < header.width; col++)
{
fscanf(image_file, "%c%c%c", &red, &green, &blue);
image->pixels[row][col].r = red;
image->pixels[row][col].g = green;
image->pixels[row][col].b = blue;
}
}
return image;
}
image_t* allocate_memory(header_t header)
{
int row;
/*First allocate memory for the image itself. The image has a header and
*a double pointer for the pixels */
image_t* image = (image_t*) malloc(sizeof(image_t));
/*After you have allocated the memory for the image you can now set the header
*equal to the header passed in.*/
image->header = header;
/*Now we need to allocate the memory for the actual pixels. This is a 2d
*array so allocate for the 2D array. */
image->pixels = (pixel_t**) malloc(sizeof(pixel_t*) * header.height);
for(row = 0; row < header.height; row++)
{
image->pixels[row] = (pixel_t*)malloc(sizeof(pixel_t) * header.width);
}
return image;
}
void write_p6(FILE* out_file, image_t* image)
{
int row = 0;
int col = 0;
//unsigned char red,green,blue;
header_t header = image->header;
strcpy(header.magicNum,"P6");
write_header(out_file, header);
//red = green = blue = 0;
/*Loop through the image and print each pixel*/
for(row = 0; row < header.height; row++)
{
for(col = 0; col < header.width; col++)
{
fprintf(out_file, "%c%c%c",
image->pixels[row][col].r,
image->pixels[row][col].g,
image->pixels[row][col].b);
}
}
}
void write_p3(FILE* out_file, image_t* image)
{
int row = 0;
int col = 0;
//unsigned char red,green,blue;
header_t header = image->header;
strcpy(header.magicNum,"P3");
write_header(out_file, header);
//red = green = blue = 0;
/*Loop through the image and print each pixel*/
for(row = 0; row < header.height; row++)
{
for(col = 0; col < header.width; col++)
{
fprintf(out_file, "%d %d %d ",
image->pixels[row][col].r,
image->pixels[row][col].g,
image->pixels[row][col].b);
}
}
}
void resizeImage(image_t* old, image_t* resized)
{
double relW = (double)(old->header.width/resized->header.width);
double relH; //do the same as above with height
int row, col;
for(row = 0; row < resized->header.height; row++)
{
for(col = 0; col < resized->header.width; col++)
{
//calculate newrow and newcol
//set resized->pixels[row][col] = old->pixels[newrow][newcol];
}
}
}
************************************************************************
// ppm_info.h //
#ifndef PPM_INFO
#define PPM_INFO
#include
#include
#include
// First meaningful line of the PPM file
typedef struct header {
char magicNum[3];
int width, height, maxVal;
} header_t;
// Represents an RGB pixel with integer values between 0-255
typedef struct pixel {
unsigned char r, g, b;
} pixel_t;
// PPM Image representation
typedef struct image {
header_t header;
pixel_t** pixels;
} image_t;
header_t read_header(FILE* image_file);
void write_header(FILE* out_file, header_t header);
image_t* read_ppm(FILE* image_file);
image_t* read_pixels(FILE* image_file, header_t header);
image_t* allocate_memory(header_t header);
void write_p6(FILE* out_file, image_t* image);
void write_p3(FILE* out_file, image_t* image);
/*Add resizeImage prototype from specification document*/
#endif
Step by Step Solution
There are 3 Steps involved in it
Step: 1
Get Instant Access to Expert-Tailored Solutions
See step-by-step solutions with expert insights and AI powered tools for academic success
Step: 2
Step: 3
Ace Your Homework with AI
Get the answers you need in no time with our AI-driven, step-by-step assistance
Get Started