Jump to content

  • Log In with Google      Sign In   
  • Create Account


Writing out image data


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
2 replies to this topic

#1 Suen   Members   -  Reputation: 160

Like
0Likes
Like

Posted 11 October 2012 - 01:45 PM

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:

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();

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):

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();

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 Posted Image 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, 11 October 2012 - 02:47 PM.


Sponsor:

#2 mrbastard   Members   -  Reputation: 1573

Like
0Likes
Like

Posted 11 October 2012 - 02:29 PM

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 does 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 ... Posted Image


#3 Suen   Members   -  Reputation: 160

Like
0Likes
Like

Posted 11 October 2012 - 02:46 PM

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 does 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 ... Posted Image


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.




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS