We help IT Professionals succeed at work.

Check out our new AWS podcast with Certified Expert, Phil Phillips! Listen to "How to Execute a Seamless AWS Migration" on EE or on your favorite podcast platform. Listen Now

x

C; GD; image output not working

BaconU
BaconU asked
on
Medium Priority
249 Views
Last Modified: 2012-05-07
I'm using C to develop a dynamic image set with GD, and am having problems with the output of the image.  The source is simple right now so that I can just get the stupid thing working.  The provided code below compiles without error or problem (using gcc -Wall -lgd testimage.c -o testimage).  When I run it from the command line, the output appears as it should (the content type shows up and then the PNG header and then PNG data), but when I load it in a browser, it doesn't work.

Firefox keeps telling me "You have chosen to open 'testimage' which is an 'application/octet-stream'.  If I embed the image in HTML code using an <IMG> tag, I just get the broken image thing.  IE will not display it either.  I must be missing something.

Any ideas why it's not working?

#include <stdio.h>
#include "gd.h"
 
int main(void)
{
  gdImagePtr im;
  int        black;
  int        white;
 
  im    = gdImageCreate(64, 64);
  black = gdImageColorAllocate(im, 0, 0, 0);
  white = gdImageColorAllocate(im, 255, 255, 255);
 
  gdImageRectangle(im, 0, 0, 63, 63, black);
  gdImageLine(im, 0, 0, 63, 63, white);
 
  printf("Content-Type: image/jpeg\n\n");
  gdImagePng(im, stdout);
 
  gdImageDestroy(im);
  return 0;
}

Open in new window

Comment
Watch Question

CERTIFIED EXPERT
Top Expert 2009

Commented:
Don't you want to save the image to a file first ? Right now, you're just printing it to stdout, seemingly to try to construct an HTTP response, but that's not really how HTTP responses are constructed.

Try saving it to a file, then try opening the file, and see if that works.
CERTIFIED EXPERT
Top Expert 2009

Commented:
Something like :
#include <stdio.h>
#include "gd.h"
 
int main(void)
{
  gdImagePtr im;
  int        black;
  int        white;
 
  im    = gdImageCreate(64, 64);
  black = gdImageColorAllocate(im, 0, 0, 0);
  white = gdImageColorAllocate(im, 255, 255, 255);
 
  gdImageRectangle(im, 0, 0, 63, 63, black);
  gdImageLine(im, 0, 0, 63, 63, white);
 
  {
    FILE *out = fopen("image.png", "wb");
    gdImagePng(im, out);
    fclose(out);
  }
 
  gdImageDestroy(im);
  return 0;
}

Open in new window

CERTIFIED EXPERT
Top Expert 2009
Commented:
Unlock this solution and get a sample of our free trial.
(No credit card required)
UNLOCK SOLUTION

Author

Commented:
I don't want to save it to a file, because yes I am using it as a CGI.  I apparently have Mal's disease aka  a problem of my brain being missing.  I figured out about the time of your second post that it was a web server parse issue, because I didn't include an extension on the executable.  So, the code works perfectly as it should... just not the operator. :)
CERTIFIED EXPERT
Top Expert 2009

Commented:
Heh, that happens to the best of us ;)
Unlock the solution to this question.
Thanks for using Experts Exchange.

Please provide your email to receive a sample view!

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.