Table of Contents

Corning Community College

CSCS1320 C/C++ Programming

Project: IMAGE PROCESSING - CIRCLE OF SQUARES (cos0)

Objective

To apply our existing knowledge of programming constructs in the application of a specific end result: a program that utilizes an image processing library to produce an image of a circle, constructed of squares.

Prerequisites/Corequisites

In addition to the new skills required on previous projects, to successfully accomplish/perform this project, the listed resources/experiences need to be consulted/achieved:

Background

We've spent our time so far this semester covering the basic concepts of programming, in C. Variables, selection statements, iteration, functions, structs, etc.

Now that we've gotten through all of them, it is time to start applying those concepts so that deeper and further familiarity can be gained. This project is one such attempt at that.

We all know what a circle is, and in various math classes we've even explored various methods for doing things with circles (they have a radius, a circumference, a diameter), but how would we enable the computer to draw a circle?

One piece of that, obviously, is the math.

Another piece is the programmatic piece. A circle implies something visual. On the computer that means an image.

So: we are going to use the gd image processing library to aid us in generating the image.

Program

Your task is to write a program that generates an image (PNG file), that is placed in your lab46 webspace for viewing, that does the following:

Now, gd has functions for drawing circles. You are NOT to use them for this project. As I said, this is a circle of squares. As such, you will be making use of the gdImageFilledRectangle() function.

getting started

You may make use of the following skeleton program to assist you in doing this project.

Note that this code is not in conformance with project specifications, but is provided to give you a starting place for modifications and additions:

/*
 * cos0.c   - skeleton code to use the GD graphics library
 *                        to create an image (circle of squares).
 *
 * To compile: type 'make' to compile the program
 *         or: gcc --std=c99 -Wall -o cos0 cos0.c -lgd
 * To execute: ./cos0 ARGS
 *
 * Documentation:  http://www.boutell.com/gd/manual2.0.33.html
 *                 https://libgd.github.io/manuals/2.1.1/index/Functions.html
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <gd.h>
 
// color values
//
#define BLACK       0
#define BLUE        1
#define GREEN       2
#define RED         3
#define WHITE       4
 
int main(int argc, char **argv)
{
        //////////////////////////////////////////////////////////////////
        //
        // Declare variables
        //
        char               *outfile;    // name out of the output file
        FILE               *out;        // output file pointer
        gdImagePtr          img;        // GD Image Construct
        unsigned int        color[5];   // color array
        unsigned short int  wide, high; // image attributes
 
        //////////////////////////////////////////////////////////////////
        //
        // Check arguments
        //
        if (argc     == 2)
        {
                outfile   = *(argv+1);
                fprintf(stdout, "Using '%s' as output filename\n", outfile);
        }
        else
        {
                outfile   = (char *) malloc (sizeof(char) * 64);
                sprintf(outfile, "/home/%s/public_html/cos0.png", getenv("USER"));
        }
 
        //////////////////////////////////////////////////////////////////
        //
        // image dimensions
        //
        wide          = 600;
        high          = 800;
 
        //////////////////////////////////////////////////////////////////
        //
        // Create new image of specified wide-ness and high-ness
        //
        img           = gdImageCreate(wide, high);
 
        //////////////////////////////////////////////////////////////////
        //
        // Some GD color definitions
        //
        color[BLACK]  = gdImageColorAllocate(img, 0x00, 0x00, 0x00);
        color[BLUE]   = gdImageColorAllocate(img, 0x00, 0x00, 0xFF);
        color[GREEN]  = gdImageColorAllocate(img, 0x00, 0xFF, 0x00);
        color[RED]    = gdImageColorAllocate(img, 0xFF, 0x00, 0x00);
        color[WHITE]  = gdImageColorAllocate(img, 0xFF, 0xFF, 0xFF);
 
        //////////////////////////////////////////////////////////////////
        //
        // Paint the background black
        //
        gdImageFilledRectangle(img, 0, 0, wide-1, high-1, color[BLACK]);
 
    /****************************************************************
     *                                                              *
     *  =============>  YOUR CODE/PROGRAM GOES HERE  <============  *
     *                                                              *
     ****************************************************************/
 
        //////////////////////////////////////////////////////////////////
        //
        // Open the file
        //
        out           = fopen(outfile, "wb");
        if(out       == NULL)
        {
                fprintf(stderr, "Error opening '%s'\n", outfile);
                exit(1);
        }
 
        //////////////////////////////////////////////////////////////////
        //
        // Set sane file permissions on image file
        //
        chmod (outfile, 0644);
 
        //////////////////////////////////////////////////////////////////
        //
        // Send image to file
        //
        gdImagePngEx(img, out, -1);
 
        //////////////////////////////////////////////////////////////////
        //
        // Close things up
        //
        fclose(out);
        gdImageDestroy(img);
 
        return(0);
}

How to view your image

When you have a functioning project and want to view the images generated, you need to make sure they are deployed into your public_html/ directory.

To view your image in a web browser, simply point it at the following URL:

… where “USERNAME” is your lab46 username (in lowercase), and “IMAGE” is the name of your png file (likely also in lowercase, such as 'cos0').

Note that the tilde just prior to your username in the URL is critical and necessary.

Grabit Integration

I rigged up a skeleton file in a grabit project to kickstart your efforts.

To “grab” it:

lab46:~/src/cprog$ grabit cprog cos0
make: Entering directory '/var/public/SEMESTER/cprog/cos0'
‘/var/public/SEMESTER/cprog/cos0/Makefile’ -> ‘/home/USERNAME/src/cprog/cos0/Makefile’
‘/var/public/SEMESTER/cprog/cos0/cos0.c’ -> ‘/home/USERNAME/src/cprog/cos0/cos0.c’
make: Leaving directory '/var/public/SEMESTER/cprog/cos0'
lab46:~/src/cprog$ cd cos0
lab46:~/src/cprog/pos0$ ls
Makefile  cos0.c
lab46:~/src/cprog/pos0$ 

And, of course, your basic compile and clean-up operations:

Just another “nice thing” we deserve.

NOTE: You do NOT want to do this on a populated cos0 project directory– it will overwrite files. Only do this on an empty directory.

Submission

To successfully complete this project, the following criteria must be met:

To submit this program to me using the submit tool, run the following command at your lab46 prompt:

$ submit cprog cos0 cos0.c cos0.png http://lab46.corning-cc.edu/~USERNAME/cos0.png
Submitting cprog project "cos0":
    -> cos0.c(OK)
    -> cos0.png(OK)
    -> http://lab46.corning-cc.edu/~USERNAME/cos0.png

SUCCESSFULLY SUBMITTED

You should get some sort of confirmation indicating successful submission if all went according to plan. If not, check for typos and or locational mismatches.

What I'll be looking for:

78:cos0:final tally of results (78/78)
*:cos0:submit project [4/4]
*:cos0:level of adequate modification in cos0.c [4/4]
*:cos0:level of adequate commenting in cos0.c [4/4]
*:cos0:level of adequate indentation in cos0.c [4/4]
*:cos0:cos0.c generates circle via algorithm [8/8]
*:cos0:no negative compiler messages [4/4]
*:cos0:circle of squares is achieved [8/8]
*:cos0:deployed to public_html [4/4]
*:cos0:checks for and implements error conditions [6/6]
*:cos0:image width and height cannot be the same [4/4]
*:cos0:cos0.c commit and pushed to lab46 repo [4/4]
*:cos0:makes use of gd image library [4/4]
*:cos0:reads image details in via arguments [4/4]
*:cos0:can adjust output file name with optional last argument [4/4]
*:cos0:image border meets specifications [4/4]
*:cos0:image background meets specifications [4/4]
*:cos0:circle color meets specifications [4/4]
*:cos0:circle size meets specifications [4/4]