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
Best regards
Edited by Suen, 11 October 2012 - 02:47 PM.






