learning C 0 Newbie Poster

i have to write an image processing program that can invert, blur, sharpen, threshold, and then resave an image. here is what i have so far:

//----------------------------------------------------------------------

//     SECTION 1: Preprocessor Commands

//----------------------------------------------------------------------

// Include Win32 API Libraries (headers)

#include <windows.h>

#include <windowsx.h>

#include <commctrl.h>

#include <string.h>

#include <stdio.h>

// Define the maximum number of letters that text control objects can have

#define MAXLETTERS 32000

#define MaxSize      512

// Define event-ID numbers for the control objects

#define ID_BTTN     1001

#define ID_FNAME    1002

#define ID_FOPEN    2001

#define ID_FEXIT    2002

#define ID_INV      2003

#define ID_ROTATE   2004

#define ID_BLUR     2005

#define ID_FLIP     2006

#define ID_Sharp    2007

#define ID_Shrink   2008

#define ID_Threshold 2009
//----------------------------------------------------------------------

//     SECTION 2: Computational Code

//----------------------------------------------------------------------

// Declare global variables: flowdata is available to all subsequent functions

unsigned char imgdata[MaxSize][MaxSize];

int imgheight, imgwidth;

// Function DrawData(): draws data from flowdata array onto screen

void DrawData(HWND window)

{

  // Declare local variables

  int col, row;

  unsigned char shade;

  HDC drawing_context = GetDC(window);

  // Draw the pixels

  for (row = 0 ; row < imgheight ; row++)

    for (col = 0 ; col < imgwidth ; col++)

    {

       shade = imgdata[row][col];

         SetPixel(drawing_context, col+50, row+50, RGB(shade, shade, shade));

    }

}

// flips data from flowdata array onto screen

void Inv(HWND window)

{

  // Declare local variables

  int col, row;

  unsigned char shade;

  HDC drawing_context = GetDC(window);

  // Draw the pixels


  for (row = 0 ; row < imgheight ; row++)

    for (col = 0 ; col < imgwidth ; col++)

    {

       shade = imgdata[row][col];

         SetPixel(drawing_context, col+50, 195-row, RGB(shade, shade, shade));

    }

}

//Function to blur the image

void Blur(HWND window)

{

      // Declare local variables

    int col, row;
    unsigned char shade;
    unsigned char shade0;
    unsigned char shade1;
    unsigned char shade2;
    unsigned char shade3;
    unsigned char shade4;
    unsigned char shade5;
    unsigned char shade6;
    unsigned char shade7;
    unsigned char shadeBlur;
    HDC drawing_context = GetDC(window);

      // Draw the pixels


      for (row = 0 ; row < imgheight ; row++)

        for (col = 0 ; col < imgwidth ; col++)

        {
            shade = imgdata[row][col];
            shade0 = imgdata[row-4][col-4];
            shade1 = imgdata[row-3][col-3];
            shade2 = imgdata[row-2][col-2];
            shade3 = imgdata[row-1][col-1];
            shade4 = imgdata[row+1][col+1];
            shade5 = imgdata[row+2][col+2];
            shade6 = imgdata[row+4][col+3];
            shade7 = imgdata[row+4][col+4];
            shadeBlur = (shade + shade0 + shade1 + shade2 + shade3 + shade4 + shade5 + shade5 + shade6 + shade7 )/10;
            SetPixel(drawing_context, col+50, row+50, RGB(shadeBlur, shadeBlur, shadeBlur));
        }

}
//end blur

//Function to Sharpen Image
void Sharp(HWND window)

{

      // Declare local variables

    int col, row;
    unsigned char shade;
    unsigned char shade0;
    unsigned char shade1;
    unsigned char shade2;
    unsigned char shade3;
    unsigned char shade4;
    unsigned char shade5;
    unsigned char shade6;
    unsigned char shade7;
    unsigned char shadeSharp;
    HDC drawing_context = GetDC(window);

      // Draw the pixels


      for (row = 0 ; row < imgheight ; row++)

        for (col = 0 ; col < imgwidth ; col++)

        {
    shade0 = imgdata[row-4][col-4];
    shade1 = imgdata[row-3][col-3];
    shade2 = imgdata[row-2][col-2];
    shade3 = imgdata[row-1][col-1];
    shade = imgdata[row][col];
    shade4 = imgdata[row+1][col+1];
    shade5 = imgdata[row+2][col+2];
    shade6 = imgdata[row+4][col+3];
    shade7 = imgdata[row+4][col+4];
           shadeSharp = (shade + shade0 + shade1 + shade2)*1.25;
             SetPixel(drawing_context, col+50, row+50, RGB(shadeSharp, shadeSharp, shadeSharp));

        }
}
//End Sharpen

//Function to rotate image 90 degrees

void Rotate90Degrees(HWND window)

{

    // Declare local variables

    int col, row;

    unsigned char shade;

    HDC drawing_context = GetDC(window);

    // Draw the pixels

    for (row = 0 ; row < imgwidth ; row++)

    for (col = 0 ; col < imgheight ; col++)

    {

    shade = imgdata[col][row];

     SetPixel(drawing_context, col+50, row-23, RGB(shade, shade, shade));

    }
}
//end Rotate90Degrees

//Coarsen

void Shrink(HWND window)

{

  // Declare local variables

  int col, row;

  unsigned char shade;

  HDC drawing_context = GetDC(window);

  // Draw the pixels


  for (row = 0 ; row < imgheight ; row++)

    for (col = 0 ; col < imgwidth ; col++)

    {

       shade = imgdata[row][col];

         SetPixel(drawing_context, col+50, 195-row, RGB(shade, shade, shade));

    }

}

// Function LoadData(): loads data from file name in file name box

int LoadData(HWND window)

{

  // Declare local variables

  HWND file_name_box;

  char filename[MAXLETTERS], imgformat[80];

  FILE * infile;

  int row, col, imgdepth;

  // Get the input file's name from the File Text Box

  file_name_box = GetDlgItem(window, ID_FNAME);       // get file box handle

  GetWindowText(file_name_box, filename, MAXLETTERS); // get file name from file box

  // Open the input file, for reading

  infile = fopen( filename , "r");

  if (!infile)

    {

      SetWindowText(file_name_box, "ERROR! Please Select A File First");         // signal if file does not exist

      return( -1 );

    }

  // Read-in image information from the input file

  fscanf(infile,"%s", imgformat);

  fscanf(infile,"%d", &imgwidth);

  fscanf(infile,"%d", &imgheight);

  fscanf(infile,"%d", &imgdepth);

  fgetc(infile);

  // Read-in the image data from the input file

  for (row = 0 ; row < imgheight ; row++)

    for (col = 0 ; col < imgwidth ; col++)

      imgdata[row][col] = fgetc(infile);

  // close the input file

  fclose(infile);

  return(0);

}

// Function GetFileName(): opens a file window and gets user-selected file name

void GetFileName(HWND window)

{

  // Declare local variables

  OPENFILENAME open_file_dialog;

  char filename[ MAXLETTERS ] = "";

  HWND file_name_box;

  // Initialize the Open File Dialog Data Structure

  ZeroMemory(&open_file_dialog, sizeof(open_file_dialog));   // is this really needed?

  open_file_dialog.lStructSize = sizeof(open_file_dialog);

  open_file_dialog.hwndOwner = window;                       // name of parent window

  open_file_dialog.lpstrFile = filename;                     // name of file name variable

  open_file_dialog.nMaxFile = MAXLETTERS;                    // max No of letters in file name

  open_file_dialog.lpstrFilter = "pgm Files (*.pgm)\0*.pgm\0All Files (*.*)\0*.*\0";   // type

  open_file_dialog.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST; // style

  open_file_dialog.lpstrDefExt = "pgm";                      // file extension

  // Open the File dialog, get the file name from the user and process it if non-NULL

  if ( GetOpenFileName(&open_file_dialog) )

    {

      file_name_box = GetDlgItem(window, ID_FNAME);          // get file box handle

      SetWindowText(file_name_box, filename);                // put file name in file box

    }

}

void Threshold(HWND window)

{

    // Declare local variables

    int col, row;

    unsigned char shade;

    HDC drawing_context = GetDC(window);

    // Draw the pixels

  for (row = 0 ; row < imgheight ; row++)

    for (col = 0 ; col < imgwidth ; col++)

    {

    shade = imgdata[row][col];
    if (shade>125)
        shade = 0;
    else
        shade = 255;


     SetPixel(drawing_context, col+50, row+50, RGB(shade, shade, shade));
    
    }
}
//end Rotate90Degrees
//----------------------------------------------------------------------

//     SECTION 3: GUI Building

//----------------------------------------------------------------------

// Function MakeControls(): builds control objects on a window

void MakeControls(HWND window)

{

  // Create the Label for the file name text box

  CreateWindowEx(WS_EX_STATICEDGE, "Static", "File Name:",

             WS_CHILD | WS_VISIBLE,

             70,650, 100, 20, window, NULL, NULL, NULL);

  // Create the File Name Text box

  CreateWindowEx(WS_EX_CLIENTEDGE, "Edit", NULL,

             WS_CHILD | WS_VISIBLE,

             180, 650, 300, 40, window, (HMENU) ID_FNAME, NULL, NULL);

  // Create the Draw button

  CreateWindowEx(0, "Button", "Draw", WS_CHILD | WS_VISIBLE,

             500, 650, 60, 40, window, (HMENU) ID_BTTN, NULL, NULL);

}

// Function MakeMenu(): builds menu objects on a window

void MakeMenu(HWND window)

{

  // Declare local variables

  HMENU filemenu, subfilemenu;
  HMENU imagemenu, subimagemenu;

  // Create a blank file menu

  filemenu = CreateMenu();
  imagemenu = CreateMenu();

  // Create a blank sub-menu (popup menu) for the file menu

  subfilemenu = CreatePopupMenu();
  subimagemenu = CreatePopupMenu();

  // Place Open and Exit items onto the blank popup sub-menu

  AppendMenu(subfilemenu, MF_STRING, ID_FOPEN, "&Open");

  AppendMenu(subfilemenu, MF_STRING, ID_ROTATE, "&Rotate");

  AppendMenu(subfilemenu, MF_STRING, ID_BLUR, "&Blur");

  AppendMenu(subfilemenu, MF_STRING, ID_FLIP, "&Flip");

 AppendMenu(subfilemenu, MF_STRING, ID_Sharp, "&Sharpen");

  AppendMenu(subfilemenu, MF_STRING, ID_FEXIT, "&Exit");

  AppendMenu(subfilemenu, MF_STRING, ID_Threshold, "&Threshold");

  // Place the popup sub-menu on the file menu

  AppendMenu(filemenu, MF_STRING | MF_POPUP, (UINT)subfilemenu, "&File");
   // AppendMenu(imagemenu, MF_STRING | MF_POPUP, (UINT)subimagemenu, "&Image");      
  // Place the file menu on the Main Window of the program

  SetMenu(window, filemenu);
    //InsertMenu(filemenu, MF_STRING,FALSE,  imagemenu);
  //http://msdn.microsoft.com/en-us/library/ms647616(VS.85).aspx
}


//----------------------------------------------------------------------

//     SECTION 4: Event Dispatcher

//----------------------------------------------------------------------

// Function ProcessMessages(): Specifies how to respond to user interactions

LRESULT CALLBACK ProcessMessages(HWND window, UINT message,

                         WPARAM wParam, LPARAM lParam)

{

  switch(message)

    {

    case WM_CREATE:               // what to do when the window is created

      MakeControls( window );

      MakeMenu( window );

      break;

    case WM_DESTROY:              // what to do when the window is X-ed

      PostQuitMessage(0);

      break;

    case WM_COMMAND:              // what to do if a control was activated

      switch(LOWORD( wParam))

      {

      case ID_FEXIT:            // control was Exit submenu?

        PostMessage(window, WM_CLOSE, 0, 0);

        break;

      case ID_FOPEN:            // control was Open submenu?

        GetFileName( window );

        break;

      case ID_BTTN:             // control was Draw button?

        if ( !LoadData(window) )

          DrawData( window );

        break;

      case ID_INV:             // control was Flip button?

        if ( !LoadData(window) )

          Inv( window );

        break;

      case ID_BLUR:         //Control Blur submenu
          Blur( window );

         break;

      case ID_ROTATE:       //Control Rotate submenu

         Rotate90Degrees(window);

         break;

      case ID_FLIP:       //Control Flip submenu

         Inv(window);

         break;
     
      case ID_Sharp:

        Sharp(window);
       
        break;

      
      case ID_Threshold:

        Threshold(window);
        break;
      }
    default:                      // what to do otherwise ( default )

      return DefWindowProc( window, message, wParam, lParam);

    }

  return( 0 );

}

//----------------------------------------------------------------------

//     SECTION 5: Main Window and Application Code

//----------------------------------------------------------------------

// The main program loop starts here

int WINAPI WinMain( HINSTANCE thisprogram, HINSTANCE dummy1, LPSTR dummy2, int startmode)

{

  // Define local variables

  HWND mainwindow;

  DWORD style;

  unsigned int dflt = CW_USEDEFAULT;

  MSG message;

WNDCLASSEX wc;

  // Define the class for the main window

  wc.hInstance  = thisprogram;                   // what program this class applies to

  wc.lpszClassName = "Main";                     // the name of this class

  wc.lpfnWndProc = ProcessMessages;              // the message processor

  wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );  // the icon (large)

  wc.hIconSm = NULL;                             // the icon (small)

  wc.hCursor  = LoadCursor( NULL, IDC_ARROW );   // the type of cursor

  wc.hbrBackground = ( HBRUSH )( COLOR_WINDOW ); // background color

  wc.cbSize  = sizeof( WNDCLASSEX );

  wc.style = 0;  wc.cbClsExtra = 0;  wc.cbWndExtra = 0;  wc.lpszMenuName = NULL;

  // Register this "Main" window class with the OS

  RegisterClassEx( &wc );

// Define the main window's style

  style = WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN;

  // Create the main window

  mainwindow = CreateWindowEx(0, "Main", "BIOE 241 Imager", style,

                        dflt, dflt, 800, 740, NULL, NULL, NULL, NULL);

  // Display the main window and all of its visible children

  ShowWindow( mainwindow, startmode );

  // Continuously get and process messages

  while (GetMessage(&message, NULL, 0, 0) > 0)

    {

      TranslateMessage( &message );

      DispatchMessage( &message );

    }

  // That's It!

  return( 0 );
}

i know that i probably should have used some sort of 3x3 array to make the sharpen, blur, and threshold code, but i could not figure it out no matter how long i spent trying. what i really need help with is writing the save function. can anyone tell me how/where to put it inmy code? thanks

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.