convert identical image with different name
convert identical image with different name
I'm trying to use imagemagick to convert images generated on the fly with random names. The chances are that the newly generated image might be identical to previous generated image but with different file name. If that's the case, I don't want to write the converted image to the database. I used the MessageDigest's update to generate hash id for each unique image based on their byte array value.
For example, I got two original images which are identical (I've used java's bytearray to test):
image1.jpg
image2.jpg
When I used convert -density 100 to convert the image,
convert -density 100 image1.jpg image1.png
convert -density 100 image2.jpg image2.png
I would expect the converted images (image1.png and image2.png) should be the same. But when I use java's bytearray to test, they turn out to be different.
How can ImageMagick convert two identical files with different filenames to the same image?
Thanks!
For example, I got two original images which are identical (I've used java's bytearray to test):
image1.jpg
image2.jpg
When I used convert -density 100 to convert the image,
convert -density 100 image1.jpg image1.png
convert -density 100 image2.jpg image2.png
I would expect the converted images (image1.png and image2.png) should be the same. But when I use java's bytearray to test, they turn out to be different.
How can ImageMagick convert two identical files with different filenames to the same image?
Thanks!
-
- Posts: 12159
- Joined: 2010-01-23T23:01:33-07:00
- Authentication code: 1151
- Location: England, UK
Re: convert identical image with different name
I think you will find the images are identical.
But PNG files files contain other data, such as the time of the last image modification. Byte-comparison programs will pick these up.
Code: Select all
compare -metric RMSE image1.png image2.png NULL:
snibgo's IM pages: im.snibgo.com
Re: convert identical image with different name
Yes, you are right. When I use "compare -metric RMSE image1.png image2.png NULL:" to compare, the result is 0 (0).
But my problem is that, the converted images are already in byte array format in the database. I am not able to loop through all the images and find if there is one that's the same as the newly converted image by using compare command.
Is there a way to truncate the "other data" (such as the modification date) from the converted png image and only use the portion that represents the image itself to generate the hash id using MessageDigest.
Thanks a lot!
But my problem is that, the converted images are already in byte array format in the database. I am not able to loop through all the images and find if there is one that's the same as the newly converted image by using compare command.
Is there a way to truncate the "other data" (such as the modification date) from the converted png image and only use the portion that represents the image itself to generate the hash id using MessageDigest.
Thanks a lot!
-
- Posts: 12159
- Joined: 2010-01-23T23:01:33-07:00
- Authentication code: 1151
- Location: England, UK
Re: convert identical image with different name
Not as far as I know, for PNG. But you could use a format that records nothing but the image, such as RGB (or RGBA if you have transparency):
convert image1.png image1.rgb
Jpeg also seems to give identical files for identical input images, but RGB may be safer.
convert image1.png image1.rgb
Jpeg also seems to give identical files for identical input images, but RGB may be safer.
snibgo's IM pages: im.snibgo.com
Re: convert identical image with different name
I found this post that someone seems to have similar problem: viewtopic.php?f=3&t=12230
User magick mentioned to do the following the delete file property:
convert logo.jpg +set modify-date +set create-date logo.png
I am quite new to imagemagick so I'm not sure if that's what I need do. I did try it but doesn't seem to produce the same image.
He also mentioned using DeleteImageProperty(image,"modify-date") to delete the image property but since I'm calling convert from command line it doesn't work.
Thanks a lot!
User magick mentioned to do the following the delete file property:
convert logo.jpg +set modify-date +set create-date logo.png
I am quite new to imagemagick so I'm not sure if that's what I need do. I did try it but doesn't seem to produce the same image.
He also mentioned using DeleteImageProperty(image,"modify-date") to delete the image property but since I'm calling convert from command line it doesn't work.
Thanks a lot!
-
- Posts: 12159
- Joined: 2010-01-23T23:01:33-07:00
- Authentication code: 1151
- Location: England, UK
Re: convert identical image with different name
I haven't come across "+set modify-date" or "+set create-date". When I try:
convert logo: +set modify-date +set create-date logo.png
identify -verbose logo.png
this still gives a creation and modification date. If this is a feature that no longer works, you might raise it in the bugs forum (referencing this thread, and the one you mention above).
convert logo: +set modify-date +set create-date logo.png
identify -verbose logo.png
this still gives a creation and modification date. If this is a feature that no longer works, you might raise it in the bugs forum (referencing this thread, and the one you mention above).
snibgo's IM pages: im.snibgo.com
Re: convert identical image with different name
Never used this before myself.. But I think this should work:
convert image.jpg +set date:create +set date:modify image.png
The default of storing these dates in tEXt chunks when saving to PNG indeed doesn't seem to be very useful.
convert image.jpg +set date:create +set date:modify image.png
The default of storing these dates in tEXt chunks when saving to PNG indeed doesn't seem to be very useful.
-
- Posts: 12159
- Joined: 2010-01-23T23:01:33-07:00
- Authentication code: 1151
- Location: England, UK
Re: convert identical image with different name
Good discovery, Drarakel.
On identical inputs,
convert logo1.jpg +set date:create +set date:modify logo1.png
convert logo2.jpg +set date:create +set date:modify logo2.png
gives me bytewise identical PNG files.
How did you discover this?
On identical inputs,
convert logo1.jpg +set date:create +set date:modify logo1.png
convert logo2.jpg +set date:create +set date:modify logo2.png
gives me bytewise identical PNG files.
How did you discover this?
snibgo's IM pages: im.snibgo.com
Re: convert identical image with different name
Well, I think it's possible to set/delete all the extra attributes - if one is using the correct names. And the IM attributes (and also the PNG chunks) seem to be called "date:create" and "date:modify":
Maybe it was "modify-date"/"create-date" in some past versions?
Code: Select all
Properties:
date:create: 2010-06-12T17:32:52+02:00
date:modify: 2010-06-12T17:32:52+02:00
...
Re: convert identical image with different name
This is wonderful! It works very well for the png images conversion. Now, I am able not to generate a new png image every time even though it exists in my database. Thanks a lot for all of your help.
- anthony
- Posts: 8883
- Joined: 2004-05-31T19:27:03-07:00
- Authentication code: 8675308
- Location: Brisbane, Australia
Re: convert identical image with different name
I have added this to PNG Writing options in IM Examples....
http://www.imagemagick.org/Usage/formats/#png_write
http://www.imagemagick.org/Usage/formats/#png_write
+set date:create +set date:modify
Normally if you write the same image separately to two PNG files the two files will not compare to be the same. That is because IM will also store an image creation date within the file. JPEG images do not have this problem, but they are lossy. For example...The "diff' in the above will return the messageCode: Select all
convert logo: logo.jpg convert logo.jpg logo1.png sleep 2; touch logo.jpg convert logo.jpg logo2.png diff -s logo1.png logo2.png compare -metric RMSE logo1.png logo2.png null:
"Binary files logo1.png and logo2.png differ"
Even though the "compare" returned "0 (0)" which says the images have exactly the same image data.
The solution is to save PNG images without any 'time stamps'.
For example...This time "diff" reported...Code: Select all
convert logo: logo.jpg convert logo.jpg +set date:create +set date:modify logo1.png sleep 2; touch logo.jpg convert logo.jpg +set date:create +set date:modify logo2.png diff -s logo1.png logo2.png
"Files logo1.png and logo2.png are identical"
ASIDE: you can also use the programs "cmp" or "md5sum" or "sha1sum" to compare binary image files.
Anthony Thyssen -- Webmaster for ImageMagick Example Pages
https://imagemagick.org/Usage/
https://imagemagick.org/Usage/