• Advertisement
Sign in to follow this  

Writing out image data

This topic is 1926 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hello. I'm not sure if this is really the right place to ask this but here goes. I'm trying to write an image to my hard drive. Basically I allocate space for an array big enough to hold my image and then simply insert my image data in it and write it to the hard drive. Since I'm fairly new when it comes to writing code that writes out an image to the hard drive I've decided to go with a very simple approach, I just write out a raw binary file which contains my image data and then use Adobe Photoshop CSS Extended (Ver 12.1) to open it to check that the result is correct. If I want to use some image format then it requires that I provide information for the image header and more which I want to avoid doing for the moment (although depending on my problem I might have to switch to another format).

Here's the relevant code for writing out the image to my hard drive:

[CODE]
typedef unsigned char byte;

int imageWidth = 400;
int imageHeight = 400;
int imageSize = imageWidth*imageHeight;

std::fstream imageStream;

imageStream.open("image.raw", std::ios::out|std::ios::binary);

if(!imageStream.is_open())
{
std::cout << "Could not open file" << std::endl;
exit(1);
}

for(int i=0; i<imageSize; i++)
{
imageStream.put((byte)imageData[i].r); //Red channel
imageStream.put((byte)imageData[i].g); //Green channel
imageStream.put((byte)imageData[i].b); //Blue channel
}

imageStream.close();
[/CODE]

Now this works perfectly fine IF my image width and height are of the same value. In other words I need to have the same amount of pixels horizontally as I have vertically. So if I have a 400x400 image as above I get the correct image. Photoshop will ask me, before opening the file, to describe the raw file options (dimensions of image, number of color channels etc.). Normally the default options provided by the application are already correct if I have the same value in my dimensions.

Here's the thing though, if I change my dimensions to be different from each other, say changing it to 600x150, then some problems arise. The image still gets written to the hard drive but when I open it the default raw options in Photoshop suggest that the image is a 300x300 image. If I choose this my image ends up being heavily distorted. If I choose to specify the original dimension (600x150) the image show correct results but this is only because 300*300 = 600*150 = 90000 (thus same image size) So it's a special case. If I went with something more random like 250x532 then the default Photoshop raw options consider my image to be 665x600. Changing this back to 250x532 in the Photoshop raw options will only produce a result with rubbish in it as 250*532 != 665*600 (the application will warn me that I'm decreasing the size of the image which it consider to be 665*600).

Now if I change my code to this instead (writing out a .ppm file instead of a .raw file):

[CODE]
imageStream.open("image.ppm", std::ios::out|std::ios::binary);

if(!imageStream.is_open())
{
std::cout << "Could not open file" << std::endl;
exit(1);
}

imageStream << "P6\n" << imageWidth << " " << imageHeight << "\n255\n";

for(int i=0; i<imageSize; i++)
{
imageStream.put((byte)imageData[i].r); //Red channel
imageStream.put((byte)imageData[i].g); //Green channel
imageStream.put((byte)imageData[i].b); //Blue channel
}

imageStream.close();
[/CODE]

then everything works regardless of my dimensions. Photoshop won't ask anything but just open the file with the correct dimensions and correct image result.

Now I most likely think that the problem here is not the code itself but just how Photoshop internally handle .raw file (although why it change the dimensions of an image with different values for the dimensions when I try to open it is beyond me). Especially if you compare it with the .ppm format where information about the dimension of the image is provided before writing out the data and the .raw file...provide no information at all.

In the case that this is related to Photoshop then this topic probably does not even belong in this forum [img]http://public.gamedev.net//public/style_emoticons/default/smile.png[/img] But I just want to make sure that it's not my code which is at fault here. If it is my code then what is exactly wrong and would I change this?

Best regards Edited by Suen

Share this post


Link to post
Share on other sites
Advertisement
The raw file doesn't contain any information about the dimensions of the image, so photoshop has to try to infer them from the number of pixels in the file. The ppm file [i]does [/i]contain the image's dimensions, so photoshop doesn't have to guess.

Look more closely at the code you posted and you'll see for yourself ... [img]http://public.gamedev.net//public/style_emoticons/default/smile.png[/img]

Share this post


Link to post
Share on other sites
[quote name='mrbastard' timestamp='1349987385' post='4989243']
The raw file doesn't contain any information about the dimensions of the image, so photoshop has to try to infer them from the number of pixels in the file. The ppm file [i]does [/i]contain the image's dimensions, so photoshop doesn't have to guess.

Look more closely at the code you posted and you'll see for yourself ... [img]http://public.gamedev.net//public/style_emoticons/default/smile.png[/img]
[/quote]

Yeah, basically this is what I suspected and said above, thanks. I guess the best thing to do is to switch to .ppm format instead as it seems easy to implement. Thanks again.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement