Introduction
MyPSD::CPSD
class is a C++ class that can load images saved in Adobe's Photoshop native format. Due to my new job I had to upgrade to Visual Studio 2005, but still the class is as portable as possible, hence it uses standard C++ and STL. With minor changes, it can be ported to Visual Studio 6 (uses an older version of STL) or even to other Operating Systems.
License
The class MyPSD::CPSD
is free; but if you are to use it in any kind of software, especially commercial ones, I would appreciate if you could just email me, it's nice to learn that something you've written is used by others.
Using MyPSD::CPSD in your projects
To use the class, just include in your project the two files MyPSD.h/.cpp. Since the class is placed inside its own namespace, either use the full name MyPSD::CPSD psd;
or first the directive using namespace MyPSD;
and then just declare a local variable CPSD psd;
.
How to use MyPSD::CPSD
MyPSD::CPSD psd; int nErrorCode = psd.Load("c:\\image.psd");
if ( 0 == nErrorCode )
{
int nDPI_x, nDPI_y;
int nWidth, nHeight;
psd.Dimensions(nWidth, nHeight);
psd.DPI(nDPI_x, nDPI_y);
HBITMAP hBitmap = psd.Detach();
}
else if ( -1 == nErrorCode )
;
else if ( -2 == nErrorCode )
;
else if ( -3 == nErrorCode )
;
else if ( -4 == nErrorCode )
;
else if ( -5 == nErrorCode )
;
else if ( -6 == nErrorCode )
;
else if ( -7 == nErrorCode )
;
else if ( -8 == nErrorCode )
;
else if ( -9 == nErrorCode )
;
else if ( -10 == nErrorCode )
;
else if ( -11 == nErrorCode )
;
else if ( -12 == nErrorCode )
;
How to make it compatible to Visual Studio 6
The STL that comes with Visual Studio 6 does not support the method push_back
for std::string
. One way is to use CString
s, but then you will have to use MFC, and the other way is to make some minor changes where strings are used. I.e.:
std::string strOSType;
for(unsigned int nChar = 0; nChar < 4; ++nChar)
strOSType.push_back(image_resource.OSType[nChar]);
std::string strOSType = "";
for(unsigned int nChar = 0; nChar < 4; ++nChar)
strOSType += image_resource.OSType[nChar];
More info than necessary... future release... maybe
In the MyPsd.h file, I have put more info than is actually used in the demo, as my intention is someday to implement layers as they are supported in Photoshop. The way MyPSD::CPSD
class is implemented in the current version, the HBITMAP
that someone gets is the merged outcome of all layers. In the future, I will try to have each layer separately detached from the original image, but don't hold your breath as I don't know if I have enough free time to do so.
Supported Formats
RGB, Lab, CMY, CMYK, Indexed, Grayscale, Duotone. These formats could be uncompressed or compressed with RLE.
Unsupported Formats/Not yet implemented
Bitmap (Black & White), and any format that is compressed with ZIP with prediction and without prediction, and that is basically because I don't know the ZIP compression algorithm (with and without prediction).
Thanks
I would like to thank my mathematician friend Kostas Papamarinos who helped me translate the data from planar to RGB order, and all of you who are going to use my MyPSD::CPSD
class and either send me an email or not.
What's new in version 1.0.0.4
- Bug fixes - For correctly rendering Grayscale and Duotone PSD files. Samples included in the images.zip file that previous version could not read. As Visual Studio 2005 is more strict to the standard C++ and I hated all the warnings I was getting I have used the proposed functions which supposedly are more secure. I would like to apologise for any inconvenience caused by this change. If there is any problem just replace them with their equivalent older versions. Finally, for the above mentioned reasons, I am using a function to convert doubles to integers, as I would like to avoid type casting either done by me or the system .
What's new in version 1.0.0.3
- Bug fixes - For correctly rendering PSD files. Each Image Resource Block includes a Pascal string, and the way I translated into C/C++ was not the proper way, as a result some files could not be read.
What's new in version 1.0.0.2
- Bug fixes - I've found out that my previous version had some minor memory leaks.