Page 1 of 2

Magick::writeImages() creating unstable Photoshop PSD

Posted: 2017-06-06T12:39:18-07:00
by valen
ImageMagick++ (7.0.5-7-Q8-x64-dll)
Visual Studio 2015
Windows 10
Adobe Photoshop CS6 & CC 2017

I have a similar post in the developer forum, but am leaning more towards the possibility that this is a bug.

I am creating a std::list<Magick::Image> of images. Then I use Magick::writeImages() to build a Photoshop file, for example:

Magick::writeImages(myList.begin(), myList.end(), "c:\\temp\\myPsdFile.psd", true);

The first layer in my list is made by calling Magick::flattenLayers() on all the other layers so that my first layer is the composited version of all the actual layers.

When I open the PSD in Photoshop, all the layers are locked background layers, if you know what I mean. This is bad - Photoshop only allows 1 background layer. If I start to try and convert them to regular layers, I will get messages saying that Photoshop encountered a program error. I assume this is stemming from the fact that this PSD is invalid.

Re: Magick::writeImages() creating unstable Photoshop PSD

Posted: 2017-06-06T14:03:02-07:00
by Bonzo
I seem to remember fmw42 posting something about the first layer needing to be a flattened layer of all the other layers otherwise it would cause a problem with the psd file.
When reading a psd file into imagemagick this is what you find - psd[0] is a layer/file containing all the other layers

Re: Magick::writeImages() creating unstable Photoshop PSD

Posted: 2017-06-06T14:11:19-07:00
by valen
I was thinking that the first layer *should* be the flattened layer, but really what does it matter? As long as there is a first layer, followed by more layers.
Otherwise, how do we confidently create this first layer? How is it composited?

But yes, I should have mentioned in my original post that I am creating my first layer by using Magick::flattenImages() on all the other layers. So, my first layer is "flattened".

I have clarified my original message to say that I am creating the flattened first layer.

Re: Magick::writeImages() creating unstable Photoshop PSD

Posted: 2017-06-06T14:13:18-07:00
by snibgo
I don't use Photoshop so can't help.

For people who do use PS, I suggest you paste a complete but minimal program and any required (small) input files (EDIT and the output PSD file) that demonstrate the problem.

Re: Magick::writeImages() creating unstable Photoshop PSD

Posted: 2017-06-06T15:02:42-07:00
by valen
I don't see how I can add attachments here. Well, here is an example program. It will take 3 existing JPEG images, and combine them into one 3 layer PSD file.

Note that I have recently discovered that the PSD appears to open up OK into Photoshop CC 2017, but not Photoshop CS6. I'm guessing that CC 2017 must have some error fixing going on that CS6 does not.

Code: Select all

using namespace Magick;

int main(int argc, char ** argv)
{
	InitializeMagick(*argv);

	try
	{
		std::string basePath = "c:\\temp\\";
		std::string layer1 = basePath + "layer1.jpg";
		std::string layer2 = basePath + "layer2.jpg";
		std::string layer3 = basePath + "layer3.jpg";

		Magick::Image image1(layer1);
		Magick::Image image2(layer2);
		Magick::Image image3(layer3);

		std::list<Magick::Image> layersToFlatten;
		layersToFlatten.push_back(image1);
		layersToFlatten.push_back(image2);
		layersToFlatten.push_back(image3);

		Magick::Image flattened;
		Magick::flattenImages(&flattened, layersToFlatten.begin(), layersToFlatten.end());

		std::list<Magick::Image> layersForPsd;
		layersForPsd.push_back(flattened);
		layersForPsd.push_back(image1);
		layersForPsd.push_back(image2);
		layersForPsd.push_back(image3);

		std::string outFile = basePath + "output.psd";
		Magick::writeImages(layersForPsd.begin(), layersForPsd.end(), outFile, true);
	}
	catch (std::exception &error_)
	{
		return 1;
	}

	return 0;
}

Re: Magick::writeImages() creating unstable Photoshop PSD

Posted: 2017-06-06T15:15:32-07:00
by fmw42
If you want to post some other files, you must post them to some free hosting service and put the URLs here

Re: Magick::writeImages() creating unstable Photoshop PSD

Posted: 2017-06-07T07:04:22-07:00
by valen
Oh, ok. Unfortunately I am unable to do that at my job. But the code example I gave above should be enough for someone with Magick++ and Photoshop experience to test out and confirm.

Re: Magick::writeImages() creating unstable Photoshop PSD

Posted: 2017-06-08T03:29:45-07:00
by dlemstra
What happens when you strip the layers? Might be that some of the files contain metadata that makes it a background layer. You should really add your files here so we can test what happens with your files. Feel free to contact me with a PM so you can only email me links to your files.

Re: Magick::writeImages() creating unstable Photoshop PSD

Posted: 2017-06-08T07:00:35-07:00
by valen
What do you mean by "strip" the layers?

The process is pretty simple to test. I could attach files, but it would be almost just as easy to create the images on your end and test them.

Just create 2 or 3 JPG images. Then build an executable that runs code like in my original code sample. Then open the outputted PSD in Photoshop CS6 or earlier and see the problem.

Otherwise, what files would you like? I will send you a PM.

Re: Magick::writeImages() creating unstable Photoshop PSD

Posted: 2017-06-14T22:26:43-07:00
by dlemstra
Can you reproduce the issue with the 'logo:' image? In other words:

Code: Select all

std::string layer1 = "logo:";
I don't own Photoshop CS6 so I cannot test what fails and I was hoping it had something to do with your images. Please test this with the logo: image on all layers and let me know if it still fails.

Re: Magick::writeImages() creating unstable Photoshop PSD

Posted: 2017-06-15T07:04:01-07:00
by valen
By "logo:" are you referring to this image?

http://www.imagemagick.org/image/logo.jpg

I tested my code sample above with that image and I got the same results. It gave me a 3 layer Photoshop PSD file and each layer is locked like a background layer. If I try to unlock them (convert them into non-background layers) the first one usually works, but the next one Photoshop says "Could not complete your request because of a program error." The file is unstable.

Re: Magick::writeImages() creating unstable Photoshop PSD

Posted: 2017-06-15T11:05:51-07:00
by dlemstra
Is it possible for you to create a PSD file that uses the logo: (you can use this as a filename, its a build-in format) with CS6 and share it here? And also share the file that you created with Magick++? Then we might be able to figure out the difference between those two files.

Re: Magick::writeImages() creating unstable Photoshop PSD

Posted: 2017-06-15T11:12:56-07:00
by fmw42
dlemstra wrote: 2017-06-15T11:05:51-07:00 Is it possible for you to create a PSD file that uses the logo: (you can use this as a filename, its a build-in format) with CS6 and share it here? And also share the file that you created with Magick++? Then we might be able to figure out the difference between those two files.
I do not think PS can read IM internal image formats with colon added to the end of the filename. It probably should be converted to a suffixed file. Identify says logo: is a GIF format. So perhaps

Code: Select all

convert logo: logo.gif
Then import logo.gif into PS.

Re: Magick::writeImages() creating unstable Photoshop PSD

Posted: 2017-06-15T11:24:27-07:00
by dlemstra
Sorry reading my message back it seems I switched the order. Thanks for your remark Fred. Just wanted to tell @valen that 'logo:' could be used as the file name in Magick++.

Re: Magick::writeImages() creating unstable Photoshop PSD

Posted: 2017-06-15T14:13:06-07:00
by valen
I have some PSD files you can test. Can you IM me with your email and I will send them as attachments...