天道酬勤,学无止境

Unique image hash that does not change if EXIF info updated

I'm looking for a way to create a unique hash for images in python and php.

I thought about using md5 sums for the original file because they can be generated quickly, but when I update EXIF information (sometimes the timezone is off) it changes the sum and the hash changes.

Are there any other ways I can create a hash for these files that will not change when the EXIF info is updated? Efficiency is a concern, as I will be creating hashes for ~500k 30MB images.

Maybe there's a way to create an md5 hash of the image, excluding the EXIF part (I believe it's written at the beginning of the file?) Thanks in advance. Example code is appreciated.

评论

In Python, you could use Image.tostring() to compute the md5 hash for the image data only, without the metadata.

import Image
import hashlib

img = Image.open(filename).convert('RGBA')
m=hashlib.md5()
m.update(img.tostring())
print(m.hexdigest())

Imagemagick already provides a method to get the image signature. According to the PHP documentation:

Generates an SHA-256 message digest for the image pixel stream.

So my understanding is that the signature isn't affected by changes in the exif information.

Also, I've checked that the PythonMagick.Image.signature method is available in the python bindings, so you should be able to use it in both languages.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Rails:使用Paperclip防止重复上传照片?(Rails: Preventing Duplicate Photo Uploads with Paperclip?)
    问题 如果用户尝试使用Paperclip将同一张照片两次上载到Rails应用程序,是否仍然会引发验证错误? 回形针似乎没有提供此功能... 我正在使用Rails 2.3.5和Paperclip(显然)。 解决方案:(或至少其中之一) 根据比林顿的建议,我决定进行MD5校验和比较: class Photo < ActiveRecord::Base #... has_attached_file :image #, ... before_validation_on_create :generate_md5_checksum validate :unique_photo #... def generate_md5_checksum self.md5_checksum = Digest::MD5.hexdigest(image.to_file.read) end def unique_photo photo_digest = self.md5_checksum errors.add_to_base "You have already uploaded that file!" unless User.find(self.user_id).photos.find_by_md5_checksum(photo_digest).nil? end # ... end 然后
  • 使用Java编辑jpeg EXIF数据(Editing jpeg EXIF data with Java)
    问题 我想编辑jpg文件的属性,例如:注释,标题,拍摄日期,相机制造商等。 我发现可以读取这些数据的库。 但是我需要一个免费的带有示例的库来对其进行编辑。 我知道apache的影像(sanselan)。 但是我无法使用它来编辑数据。 如果您以前曾经使用过它,那么仅当您提供示例代码而不是其网站上的示例代码时,我才会接受它作为答案。 因为即使使用他们的示例,我也无法编辑GPS数据以外的任何属性。 我运行代码后,文件属性详细信息仍具有相同的值。 谢谢 ! 注意:我还尝试了JHeader(https://sourceforge.net/projects/jheader/),但将其用作带有-cl选项的进程仍然没有更改属性列表。 回答1 Apache commons Imaging为我工作。 我已经扩展了此处提供的示例 所以很明显我的客户代码看起来像这样 public static void main(String[] args) throws ImageWriteException, ImageReadException, IOException { new WriteExifMetadataExample().changeExifMetadata(new File("somefilename.jpg"), new File("result_file.jpg")); }
  • Windows显示但PHP不显示的EXIF(或其他元数据)数据(EXIF (or other meta-data) data that Windows displays but PHP does not)
    问题 我正在努力从摄影师提供给客户的JPEG中提取一些信息。 在Windows下检查时,所有图像均包含在名为“标签”的字段中的数据: 为了进行一些测试,我创建了以下脚本,并使用下面的代码遍历二进制文件头中的条目。 有时我会得到ImageDescription的值。 “版权”和“作者”中通常是文本,但“标签”内容永远不会在这里显示,这是客户最想自动化的内容的捕获。 有人可以建议我如何访问“标签”字段内容吗? 文件的上传副本在这里。 更新-将IDF0更改为ANY_TAG,并根据Tiger-222的响应将3rd arg true添加到exif_read_data()中。 还在帖子末尾添加了print_r输出 更新2添加了请求的error_display()和ini_set()调用,并尝试通过https://php.net/manual/en/function.exif-read-data.php尝试使用exif_read_data()第二个arg代替0的“ ANY_TAG” <?php ini_set('display_errors', 1); ini_set('exif.encode_unicode', 'UTF-8'); // To see WINXP values error_reporting(-1); $n = (intval($_GET['n'])) ? $_GET['n']
  • 如何在不损失图像质量的情况下从JPG中删除exif?(How to remove exif from a JPG without losing image quality?)
    问题 我有一个PHP照片共享应用程序,其中使用ImageMagick将用户上传的图像调整为各种缩略图格式。 作为一种看似“智能”的方式来节省文件大小,我从这些方法中删除了exif信息,如下所示: $imagick = new Imagick($image); $imagick->stripImage(); $imagick->writeImage($image); 这行得通。 它确实删除了EXIF信息,其中30KB的大拇指节省了12KB,而变成18KB。 在单个页面上显示许多这样的缩略图时,可节省大量资金。 但是问题是它工作得太好了。 与未剥离的图像相比,生成的图像似乎丢失了许多颜色信息,并且看起来“平坦”。 根据到目前为止的研究,我的理论是以下两个或两个是正确的: 在剥离过程中,Imagick丢弃了必要的颜色配置文件信息 Imagick保存后会重新压缩图像,从而导致图像质量下降 不管问题的原因是什么,我都在寻找一种删除EXIF信息的方式,以使它不会影响图像质量或颜色本身。 这有可能吗? 更新: 根据Gerald Schneider的回答,我尝试在将图像“剥离”之前将质量设置强制为100%: $imagick = new Imagick($image); $imagick->setCompression(imagick::COMPRESSION_JPEG); $imagick-
  • 从iPhone上传的图片去除了exif数据(Image upload from iPhone strips exif data)
    问题 我建立了一个允许上传图片的网站,上传图片后,就会显示有关该图片的一些特定信息。 从计算机上载图片效果很好,当我尝试从智能手机上载图像时出现问题。 上载成功,但是现在似乎缺少从计算机上载时显示的数据的主要部分。 此代码部分是实际检索和显示数据的部分: $location = $_FILES["pic"]["tmp_name"]; $data = exif_read_data($location); var_dump($data); var_dump($data)实际上是在计算机和智能手机中转储不同的数据。 显然,它可以在Android智能手机上正常工作,仅当我尝试从iPhone上传图片时才会出现此问题。 例如,从计算机上传的var_dump : array(49) { ["FileName"]=> string(10) "php2D4.tmp" ["FileDateTime"]=> int(1367318152) ["FileSize"]=> int(30357) ["FileType"]=> int(2) ["MimeType"]=> string(10) "image/jpeg" ["SectionsFound"]=> string(24) "ANY_TAG, IFD0, EXIF, GPS" ["COMPUTED"]=> array(6) { ["html"]=>
  • 用PHP检查图像是否唯一的好方法是什么?(What is a good way to check if an image is unique using PHP?)
    问题 使用PHP检查图像是否唯一的最佳方法是什么? 假设我的目录大约有30张图片(大约500 * 500像素),并且有人上传了另一张图片,那么检查上传的图片是否不在目录中的一种好方法是什么? 是否有某种方式可以创建可以轻松比较的图像哈希值? 然后,我可以将图像的哈希值保存在目录中,并将其与上载图像的哈希值进行比较。 计算能力并不是一个大问题,它不必每分钟只能处理几张图片。 具有一个像素差异的图像也不会被视为不同的图像,这也不是事实。 该系统应该只能够过滤出完全相同的图像。 回答1 在文件上运行一个校验和..如果它与您已经拥有的校验和匹配,则它可能是完全相同的映像。 回答2 在图像文件上使用md5或sha1。 回答3 该系统应该只能够过滤出完全相同的图像。 在那种情况下,您可能只是忘记了您在谈论图像,而只是使用hash_file()创建一个哈希表将它们视为二进制文件。 当然,这也将导致仅在元数据(例如JPEG图像中的EXIF注释)方面不同的图像具有不同的哈希值。 您必须决定这对您是否有问题。 回答4 即使更改了ID3标签之类的小细节,文件的按字节比较也将失败。 要比较图片内容,您必须打开图像文件并创建实际图像像素数据的哈希。 但是,即使将JPEG文件保存两次(质量级别略有不同),也可以撤消该操作-细微的编码差异将导致像素颜色值发生变化。 因此
  • 如何对相机胶卷中的照片进行方形切割?(How to perform square cut to the photos in camera roll?)
    问题 我想像instagram一样尝试在iPhone上使用某些图像过滤器功能。 我使用imagePickerController从相机胶卷获取照片。 我了解减少了imagePickerController返回的图像以节省内存。 并且将原始图像加载到UIImage是不明智的。 但是,如何处理图像然后将其另存为原始像素呢? 我将iPhone 4S用作开发设备。 相机胶卷中的原始照片为3264 * 2448。 UIImagePickerControllerOriginalImage返回的图像为1920 * 1440 UIImagePickerControllerEditedImage返回的图像为640 * 640 imageViewOld(使用UIImagePickerControllerCropRect [80,216,1280,1280]裁剪由UIImagePickerControllerOriginalImage返回的图像)为1280 * 1224 imageViewNew(使用双倍大小的UIImagePickerControllerCropRect [80,216,2560,2560]裁剪由UIImagePickerControllerOriginalImage返回的图像)为1840 * 1224。 我检查同一张照片,Instagram继续显示是1280 * 1280 我的问题是
  • Swift如何修改从移动相机拍摄的图像中的exif信息(Swift how to modify exif info in images taken from mobile camera)
    问题 我使用UIImagePickerController在我的iOS应用中选择图像,我知道exif信息可以通过info[UIImagePickerControllerMediaMetadata] 。 但是,当我通过UIImage将图像上传到服务器时,大多数exif信息都已被分割。 我想知道是否可以在Http请求中将exif信息添加到我的图像中(此后以jpg格式上传的图像)。 如果没有,我应该如何解决这个问题? 我想更改“制作”,“模型”属性(换句话说,使用什么设备拍摄这张照片) 以下是我的代码段: func Tapped() { let myPickerController = UIImagePickerController() myPickerController.delegate = self myPickerController.sourceType = UIImagePickerControllerSourceType.Camera myPickerController.allowsEditing = false self.presentViewController(myPickerController, animated: true, completion: nil) } func imagePickerController(picker
  • Android图像方向问题与自定义相机活动有关(Android image orientation issue with custom camera activity)
    问题 我编写了一个自定义相机活动来处理在调用意图图像捕获时某些Android设备遇到的一些问题。 用户可以选择保存图像,也可以只使用从OnPictureTakenCallback返回的数据。 我遇到的问题是相对于拍摄方向正确显示图像。 我通过调用SetRequestedOrientation强制将活动以纵向显示。 当用户拍摄照片时,我如何知道相机所处的正确方向? 即用户可以旋转90度(人像)拍照。 我试图在窗口管理器的默认显示上使用getRotation() ,但是将请求的方向设置为仅返回Surface.ROTATION_0 。 更新:为了澄清我的另一个问题,如果用户不保存图像,如何仅从图片回调中的byte[]数据确定方向? 更新:使用此代码尝试下面的答案后,我得到的只是ExifInterface.ORIENTATION_NORMAL。 我还更改了代码,以仅保存从相机返回的文件,因为我不确定是否只有byte[]数据可以轻松确定方向。 private PictureCallback mPicture = new PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { File directory = new File(android.os.Environment
  • 从库数据的查找和参数slave_rows_search_algorithms
    我们前面已经知道了对于DML语句来讲其数据的更改将被放到对应的Event中。比如‘Delete’语句会将所有删除数据的before_image放到DELETE_ROWS_EVENT中,从库只要读取这些before_image进行数据查找,然后调用相应的‘Delete’的操作就可以完成数据的删除了。下面我们来讨论一下从库是如何进行数据查找的。本节我们假定参数binlog_row_image设置为‘FULL’也就是默认值,关于binlog_row_image参数的影响在第11节已经描述过了。一、从一个列子出发在开始之前我们先假定参数‘slave_rows_search_algorithms’为默认值,即:TABLE_SCAN,INDEX_SCAN因为这个参数会直接影响到对索引的利用方式。我们还是以‘Delete’操作为例,实际上对于索引的选择‘Update’操作也是一样的,因为都是通过before_image去查找数据。我测试的表结构、数据和操作如下:mysql> show create table tkkk \G*************************** 1. row *************************** Table: tkkkCreate Table: CREATE TABLE `tkkk` ( `a` int(11) DEFAULT NULL, `b
  • 如何在 Windows 手机 8 中获取捕获图像或存储图像的地理标记详细信息(How to Fetch the Geotag details of the captured image or stored image in Windows phone 8)
    问题 我想从图像中获取有关地理位置的信息,如下图所示 void cam_Completed(object sender, PhotoResult e) { if (e.TaskResult == TaskResult.OK) { Image cameraImage = new Image(); BitmapImage bImage = new BitmapImage(); bImage.SetSource(e.ChosenPhoto); cameraImage.Source = bImage; e.ChosenPhoto.Position = 0; ExifReader reader = new ExifReader(e.ChosenPhoto); double gpsLat, gpsLng; reader.GetTagValue<double>(ExifTags.GPSLatitude, out gpsLat)) reader.GetTagValue<double>(ExifTags.GPSLongitude, out gpsLng)) MessageBox.Show(gpsLat.ToString() + "" + gpsLng.ToString()); } } 以便我们可以检测拍摄图像的位置。 请帮助找到这些属性。 回答1 您需要从图像中读取EXIF数据。 您可以使用这样的库
  • How to remove exif from a JPG without losing image quality?
    I have a PHP photo sharing application in which user-uploaded images are resized into various thumb formats using ImageMagick. As a seemingly "smart" way to save on file size, I am stripping exif info from these thumbs as follow: $imagick = new Imagick($image); $imagick->stripImage(); $imagick->writeImage($image); This works. It does remove the EXIF info, where a thumbs of 30KB saves 12KB and becomes 18KB. A significant saving when showing many of such thumbs on a single page. The problem however is that it works a little too well. The resulting images seem to lose a lot of color information
  • Python:从图像中删除Exif信息(Python: Remove Exif info from images)
    问题 为了减小要在网站中使用的图像的大小,我将质量降低到80-85%。 这样可以最大程度地减小图像尺寸。 为了进一步减小尺寸而不影响质量,我的朋友指出,相机的原始图像包含大量称为Exif info的元数据。 由于无需为网站中的图像保留此Exif信息,因此我们可以将其删除。 这将使大小进一步减少3-10 kB。 但是我无法在Python代码中找到合适的库来执行此操作。 我浏览了相关问题并尝试了一些方法: 原始图片:http://mdb.ibcdn.com/8snmhp4sjd75vdr27gbadolc003i.jpg 滋润/usr/local/bin/mogrify -strip filename 结果:http://s23.postimg.org/aeaw5x7ez/8snmhp4sjd75vdr27gbadolc003i_mogrify.jpg此方法将尺寸从105 kB减小到99.6 kB,但还改变了颜色质量。 Exif工具exiftool -all= filename 结果:http://s22.postimg.org/aiq99o775/8snmhp4sjd75vdr27gbadolc003i_exiftool.jpg此方法将大小从105 kB减小到72.7 kB,但同时也改变了颜色质量。 该答案详细说明了如何操作Exif信息,但是如何使用它来删除该信息?
  • python的Exif操作库(Exif manipulation library for python [closed])
    问题 关门了。 这个问题是基于意见的。 它当前不接受答案。 想要改善这个问题吗? 更新问题,以便可以通过编辑此帖子以事实和引用的形式回答。 7年前关闭。 改善这个问题 我正在寻找适用于python的exif(可交换图像文件格式)操纵库。 与处理速度相比,我更喜欢灵活性(例如,检索提供商专有标签的能力)。 你有什么建议? 回答1 您可能需要检出exif-py: 从tiff和jpeg文件提取EXIF数据的Python库。 非常易于使用-$ ./EXIF.py image.jpg 或Python Imaging Library(PIL): Python Imaging Library(PIL)为您的Python解释器添加了图像处理功能。 该库支持多种文件格式,并提供强大的图像处理和图形功能。 还有一个恰当命名的pyexif:http://pyexif.sourceforge.net/ pyexif python库和工具旨在从包含它的Jpeg和Tiff文件中提取EXIF信息。 此信息通常包含在使用数字成像设备(例如,数码相机,数字胶片扫描仪等)创建的图像中。 但是,似乎pyexif已有相当一段时间没有更新。 他们建议如果他们的技巧不正确,不能签出EXIF-py,那么您可能应该先尝试一下,因为他们的sourceforge页面最近似乎有一些活动,尽管数量不多。 最后
  • .NET C#库用于无损Exif重写? [关闭](.NET C# library for lossless Exif rewriting? [closed])
    问题 关闭。 此问题不符合堆栈溢出准则。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使它成为Stack Overflow的主题。 3年前关闭。 改善这个问题 我发现了用于编辑Exif的各种代码和库。 但是,只有当图像的宽度和高度是16的倍数时,它们才是无损的。 我正在寻找一个库(或什至自己做一种方法)来编辑JPEG文件中的Exif部分(或添加Exif数据(如果尚不存在的话)),而其他数据保持不变。 那不可能吗? 到目前为止,我只能找到Exif部分(以0xFFE1开头),但我不知道如何读取数据。 回答1 如果您打算编写自己的库来编辑标签,则以下是Exif交换格式的规范。 http://www.exif.org/specifications.html 这是一个用Perl编写的库,可以满足您的需求,您也许可以从中学习: http://www.sno.phy.queensu.ca/~phil/exiftool/ 这是一个不错的.NET库,用于The Code Project中的Exif评估: http://www.codeproject.com/KB/graphics/exiftagcol.aspx 回答2 您可以在没有任何外部库的情况下执行此操作: // Create image. Image image1 = Image.FromFile("c:\\Photo1.jpg")
  • Python: Remove Exif info from images
    In order to reduce the size of images to be used in a website, I reduced the quality to 80-85%. This decreases the image size quite a bit, up to an extent. To reduce the size further without compromising the quality, my friend pointed out that raw images from cameras have a lot of metadata called Exif info. Since there is no need to retain this Exif info for images in a website, we can remove it. This will further reduce the size by 3-10 kB. But I'm not able to find an appropriate library to do this in my Python code. I have browsed through related questions and tried out some of the methods
  • EXIF (or other meta-data) data that Windows displays but PHP does not
    I am working to pull some information from JPEGs supplied to my client by a photographer. When examined under Windows all of the images contain data in a field called Tags: To do some testing first I made the following script and am iterating over entries in the binary file headers using the code below. Sometimes I get values for ImageDescription. Often text in Copyright and Author but the Tags content never ever shows up here and it is the capture of that content the client most wants to automate. Can anyone advise me as to how I can access the Tags field content? Uploaded copy of file is
  • 拍摄人像时Android相机意图保存图像风景[重复](Android Camera Intent Saving Image Landscape When Taken Portrait [duplicate])
    问题 这个问题已经在这里有了答案: 为什么使用相机意图捕获的图像在Android的某些设备上旋转? (25个答案) 2年前关闭。 我环顾四周,但似乎并没有解决这个非常恼人的问题的可靠答案/解决方案。 我以纵向拍摄照片,然后按“保存/放弃”按钮时,按钮的拍摄方向也正确。 问题是当我随后在横向上检索图像时(图像已逆时针旋转90度) 我不想强迫用户以特定方向使用相机。 有没有一种方法可以检测照片是否以人像模式拍摄,然后解码位图并将其以正确的方式向上翻转? 回答1 照片始终以相机内置在设备中的方向拍摄。 为了使图像正确旋转,您必须读取存储在图片中的方向信息(EXIF元数据)。 在那里存储了当拍摄图像时设备如何定向。 这是一些读取EXIF数据并相应旋转图像的代码: file是图像文件的名称。 BitmapFactory.Options bounds = new BitmapFactory.Options(); bounds.inJustDecodeBounds = true; BitmapFactory.decodeFile(file, bounds); BitmapFactory.Options opts = new BitmapFactory.Options(); Bitmap bm = BitmapFactory.decodeFile(file, opts)
  • iOS 8照片框架。 访问照片元数据(iOS 8 Photos framework. Access photo metadata)
    问题 我正在寻找在我的应用程序中用Photos框架替换ALAssetsLibrary 。 我可以很好地检索照片,收藏集和资产来源(甚至将它们写回),但是看不到任何地方可以访问照片的元数据(诸如{Exif},{TIFF},{GPS},等等...)。 ALAssetsLibrary有一种方法。 UIImagePickerController有一种方法。 Photos必须有一种方法。 我看到PHAsset具有一个可以用于GPS词典的location属性,但是我希望访问所有元数据,包括面部,方向,曝光度,ISO和更多信息。 目前,苹果公司的Beta版本为2。也许还会有更多的API? 更新 没有正式的方法仅使用Photos API来执行此操作。 但是,下载图像数据后,您可以读取元数据。 有两种方法可以使用PHImageManager或PHContentEditingInput来执行此操作。 PHContentEditingInput方法所需的代码更少,并且不需要导入ImageIO 。 我将其包装在PHAsset类别中。 回答1 如果请求内容编辑输入,则可以将完整图像作为CIImage ,并且CIImage具有标题为properties ,该properties是包含图像元数据的字典。 示例Swift代码: let options =
  • 控制相机纵向拍摄并不会旋转最终图像(Controlling the camera to take pictures in portrait doesn't rotate the final images)
    问题 我试图控制Android相机在人像应用中拍照,但是当我保存图片时,它是横向的。 我已使用setCameraDisplayOrientation()方法将图像旋转了90个等级,但不起作用。 然后,我找到了这篇文章,但TAG_ORIENTATION为0 (未定义)。 如果我捕获了该值并应用了旋转值,那么也将不起作用。 如何拍摄人像照片并以良好的方向保存? /** Initializes the back/front camera */ private boolean initPhotoCamera() { try { camera = getCameraInstance(selected_camera); Camera.Parameters parameters = camera.getParameters(); // parameters.setPreviewSize(width_video, height_video); // parameters.set("orientation", "portrait"); // parameters.set("rotation", 1); // camera.setParameters(parameters); checkCameraFlash(parameters); // camera.setDisplayOrientation(