![]() |
Multimedia »
General Graphics »
General
Intermediate
License: The Code Project Open License (CPOL)
Import Adobe Photoshop (.psd) imagesBy ihamlA generic class to import Adobe's Photoshop (.psd) images. |
VC6, VC7.1Win2K, WinXP, Win2003, MFC, STL, GDI, VS.NET2003, Dev
|
|
Advanced Search Add to IE Search |
|
|
|
||||||||||||||||

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.
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.
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;.
MyPSD::CPSD psd; int nErrorCode = psd.Load("c:\\image.psd"); if ( 0 == nErrorCode ) // No errors were found { int nDPI_x, nDPI_y; // for Horizontal & Vertical dpi int nWidth, nHeight; // for Width & Height in pixels psd.Dimensions(nWidth, nHeight); psd.DPI(nDPI_x, nDPI_y); HBITMAP hBitmap = psd.Detach(); } else if ( -1 == nErrorCode ) // Cannot open file ; // Do something else if ( -2 == nErrorCode ) // Error in the header of the file ; // Do something else if ( -3 == nErrorCode ) // Error in ColourMode Data, i.e. Palette ; // Do something // File must be Index to have ColourMode Data else if ( -4 == nErrorCode ) // Error in ImageResource section of the file ; // Do something else if ( -5 == nErrorCode ) // Error in Mask Info section of the file ; // Do something else if ( -6 == nErrorCode ) // Error in Image Data section of the file ; // Do something // Actual data for pixels else if ( -7 == nErrorCode ) // Image is Black & White ; // Do something // not yet implemented else if ( -8 == nErrorCode ) // An unsupported file format encountered ; // Do something else if ( -9 == nErrorCode ) // Cannot create HBITMAP handle ; // Do something else if ( -10 == nErrorCode ) // Data are compressed ; // Do something // Zip format without prediction. Not yet // implemented else if ( -11 == nErrorCode ) // Data are compressed ; // Do something // Zip format with prediction. Not yet // implemented else if ( -12 == nErrorCode ) // Data are in an unknown format ; // Do something
The STL that comes with Visual Studio 6 does not support the method push_back for std::string. One way is to use CStrings, 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];
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.
RGB, Lab, CMY, CMYK, Indexed, Grayscale, Duotone. These formats could be uncompressed or compressed with RLE.
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).
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.
General
News
Question
Answer
Joke
Rant
Admin
|
PermaLink |
Privacy |
Terms of Use
Last Updated: 24 Jul 2006 Editor: Chris Maunder |
Copyright 2005 by ihaml Everything else Copyright © CodeProject, 1999-2009 Web10 | Advertise on the Code Project |