Modifying JPEG Metadata without Recompressing Image in iOS - ios

I'm trying to use
CGImageSourceCreateWithData
CGImageDestinationCreateWithData
and then
CGImageDestinationAddImageFromSource
but this discards any thumbnails or other embedded information in the original file. What I want to do is read in the file, alter its metadata, and write it out with the alterations only. But I'll settle for reading everything out of it, and putting it back again. Right now a 1.2MB image file gets converted to a 437kB file with the loss of additional data.
Is there something other than CGImage I can use? Can this even be done with the iOS API?

The problem you face is that the structure of the metadata depends upon the specific JPEG file format you are using.
You need to look at CGImageProperties. You're going to have to make sure the properties for your specific file format get copied as well.

What I was looking for was a read-modify-write operation for image files that allowed changes but otherwise maintained unaltered data. I've determined through research and testing that this is not possible in iOS. The closest mechanism available is CGImage processing, but this only allows you to read selected information from a source image (such as image, thumbnail, properties), and then use some of that information (image, properties) to create a new destination file. There's no way to include a thumbnail in the new destination file, and no way to get around recompressing the image.

As of iOS 7 you can use CGImageDestinationCopyImageSource "to modify EXIF and other image metadata in JPEG, PNG, PSD, and TIFF files without recompressing the image data"
https://developer.apple.com/library/archive/qa/qa1895/_index.html

Related

Edit Exif Data in iOS Photos Gallery/ LIbrary without Creating Another Copy

Is there a way to edit/ modify the exif data of the photot that are part of iOS photo library / gallery on the iPhone. Whenever I try to do that, iOS tries to save it as a separate image file. However, I would like to modify the exif data, without creating another copy of the photo. I used libexif as mentioned in the links below, however libexif lets you read and modify the data, but I could not figure out a way to store in the same file.
Gallery APIs in IOS (ALAsset, PhotoKit) do not seem to provide direct access to underlying physical file. They only provide APIs using which the image content can be accessed/ updated or inserted. They do not seem to have apis to modify the exif data. Also, libexif seems to work on the raw filename path. Is there a way to get the raw filename using PhotoKit or ALAsset ?
Am I missing something? Any help or pointers will be deeply appreciated.
How to write or modify EXIF data for an existing image on the filesystem, without loading the image?
Save original image data with modified metadata (no re-encoding) on iOS

How can I safely remove color scheme profile metadata while generating image preview on server?

User uploads image in browser. On server side I generate preview. I want to remove metadata from preview image. Options:
Remove everything (EXIF, ICC) and save image with the color scheme profile it was uploaded. Is it safe? Will ImageMagic process such images correctly? Will browsers display this properly?
Remove everything and convert the preview to sRGB.
Check ICC color profile and if it is not sRGB - do not remove it.
Any other ideas? Which approach would you reccomend / use in your projects?
Thanks,
The hump you face is dealing with the various forms of JPEG file formats.
In a JFIF file, you could remove all the COM and APPn markers (save APP0), to clean out the metadata and have a readable file.
In an Exif file, APP1 is used in place of JFIF's APP0. However, the EXIF APP1 marker can include metadata.
One thing you could try is to simply strip out all APPn and COM markers. It is likely that many browsers would be able to read JPEG streams without a file format specified and that the would assume a 3 component stream is YCbCr and a 1 component stream is grayscale.
Another solution would be to convert everything to JFIF.

How can I recover PNG images from a .pvr.ccz file?

I have an existing Cocos2D game that uses sprite images taken from a .pvr.ccz file, probably generated by TexturePacker. However, I don't have the original PNG images used to create that file, and I need to make some changes to the images in the game. Are there any tools or techniques that I can use to pull the images out of the .pvr.ccz file, or do I need to write my own tool?
Not possible if they use the encryption option of Texture Packer:
I've added a new feature to TexturePacker which helps you to prevent all this from happening. It's called ContentProtection and simply encrypts the images.
Your app will still be able to decrypt the data, but somebody else is going to have a hard time getting it done.
Source: https://www.codeandweb.com/texturepacker/contentprotection

Writing Image to ALAssetsLibrary Results in a Different File Hash

I have an application that is downloading images from a server and inserting them into the iPhone's ALAssetsLibrary so that the user can see those images in their saved album. I am trying to do a confirmation by comparing file hashes to ensure the image was downloaded successfully. I have the file hash as the file exists on the server. Once I finish writing the image to the ALAssetsLibrary, I generate a file hash on the client. I'm observing that the file hashes are different but the files appear to be the same. I'm curious as to whether or not the client is altering these images somehow that I may not know about (aspect ratio, scale, metadata, etc). Any guidance, opinions, or advice would be helpful.
The image-data itself is not altered during import into the Assets-Library. However, I observed that JPEG files get about 10KB bigger, after they have been imported into the Assets-Library. The Assets-Library seems to add a JFIF-Metadata-Dictionary to the file, if not already present.

Why do we need to call jpeg_write_marker() and jpeg_write_header() after jpeg_start_compress() ? [libjpeg]

From my understanding, libjpeg is a library used to compress the image data. I should be able to write the marker metadata without calling jpeg_start_compress() function.
I have 2 questions:
Why doesn't libjpeg allow that?
If I have a source jpeg file (which is already compressed), how can I just modify the metadata details? Is there any flag which I can set to notify the library that we are dealing with compressed images and we just need to modify the metadata details?
Please help.

Resources