diff options
author | yawano <yawano@chromium.org> | 2015-01-06 21:13:21 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-01-07 05:14:03 +0000 |
commit | 4cf5bd9e50d5c81d2d5b09a901badeb1fb8172dd (patch) | |
tree | e965177e7f723f00fc36cb7d35fd8fe38d971d45 | |
parent | 807179c6d8cbfd05554964e1ec290f4042af43c1 (diff) | |
download | chromium_src-4cf5bd9e50d5c81d2d5b09a901badeb1fb8172dd.zip chromium_src-4cf5bd9e50d5c81d2d5b09a901badeb1fb8172dd.tar.gz chromium_src-4cf5bd9e50d5c81d2d5b09a901badeb1fb8172dd.tar.bz2 |
Change exif encoder to copy fields of original image.
This CL also changes to set compression tag and update software name tag.
BUG=437142
TEST=out/Release/browser_tests --gtest_filter=GalleryJsTest.ExifEncoderTest
Review URL: https://codereview.chromium.org/831333005
Cr-Commit-Position: refs/heads/master@{#310234}
4 files changed, 80 insertions, 14 deletions
diff --git a/ui/file_manager/file_manager/foreground/js/metadata/exif_constants.js b/ui/file_manager/file_manager/foreground/js/metadata/exif_constants.js index 3df514d..bb23871 100644 --- a/ui/file_manager/file_manager/foreground/js/metadata/exif_constants.js +++ b/ui/file_manager/file_manager/foreground/js/metadata/exif_constants.js @@ -51,7 +51,9 @@ Exif.Tag = { JPG_THUMB_LENGTH: 0x0202, IMAGE_WIDTH: 0x0100, IMAGE_HEIGHT: 0x0101, + COMPRESSION: 0x0102, ORIENTATION: 0x0112, X_DIMENSION: 0xA002, - Y_DIMENSION: 0xA003 + Y_DIMENSION: 0xA003, + SOFTWARE: 0x0131, }; diff --git a/ui/file_manager/gallery/js/image_editor/exif_encoder.js b/ui/file_manager/gallery/js/image_editor/exif_encoder.js index 70a91a4..1ddebbe 100644 --- a/ui/file_manager/gallery/js/image_editor/exif_encoder.js +++ b/ui/file_manager/gallery/js/image_editor/exif_encoder.js @@ -5,17 +5,18 @@ /** * The Exif metadata encoder. * Uses the metadata format as defined by ExifParser. - * @param {!Object} original_metadata Metadata to encode. + * @param {!Object} originalMetadata Metadata to encode. * @constructor * @extends {ImageEncoder.MetadataEncoder} * @struct */ -function ExifEncoder(original_metadata) { +function ExifEncoder(originalMetadata) { ImageEncoder.MetadataEncoder.apply(this, arguments); - this.ifd_ = this.metadata_.ifd; - if (!this.ifd_) - this.ifd_ = this.metadata_.ifd = {}; + if (this.metadata_.media && this.metadata_.media.ifd) + this.ifd_ = this.metadata_.media.ifd; + else + this.ifd_ = {}; } ExifEncoder.prototype = {__proto__: ImageEncoder.MetadataEncoder.prototype}; @@ -23,6 +24,13 @@ ExifEncoder.prototype = {__proto__: ImageEncoder.MetadataEncoder.prototype}; ImageEncoder.registerMetadataEncoder(ExifEncoder, 'image/jpeg'); /** + * Software name of Gallery.app. + * @type {string} + * @const + */ +ExifEncoder.SOFTWARE = 'Chrome OS Gallery App\0'; + +/** * @override */ ExifEncoder.prototype.setImageData = function(canvas) { @@ -49,8 +57,12 @@ ExifEncoder.prototype.setImageData = function(canvas) { // Always save in default orientation. delete this.metadata_['imageTransform']; ExifEncoder.findOrCreateTag(image, Exif.Tag.ORIENTATION).value = 1; -}; + // Update software name. + var softwareTag = ExifEncoder.findOrCreateTag(image, Exif.Tag.SOFTWARE, 2); + softwareTag.value = ExifEncoder.SOFTWARE; + softwareTag.componentCount = ExifEncoder.SOFTWARE.length; +}; /** * @override @@ -90,6 +102,10 @@ ExifEncoder.prototype.setThumbnailData = function(canvas, quality) { // Always save in default orientation. ExifEncoder.findOrCreateTag(thumbnail, Exif.Tag.ORIENTATION).value = 1; + + // When thumbnail is compressed with JPEG, compression must be set as 6. + ExifEncoder.findOrCreateTag(this.ifd_.image, Exif.Tag.COMPRESSION).value = + 6; } else { console.warn( 'Thumbnail URL too long: ' + this.metadata_.thumbnailURL.length); @@ -331,10 +347,14 @@ ExifEncoder.getComponentWidth = function(tag) { */ ExifEncoder.writeValue = function(bw, tag) { if (tag.format === 2) { // String - if (tag.componentCount != tag.value.length) { + if (tag.componentCount !== tag.value.length) { throw new Error( 'String size mismatch for 0x' + Number(tag.id).toString(16)); } + + if (tag.value.charAt(tag.value.length - 1) !== '\0') + throw new Error('String must end with null character.'); + bw.writeString(/** @type {string} */ (tag.value)); } else { // Scalar or rational var width = ExifEncoder.getComponentWidth(tag); diff --git a/ui/file_manager/gallery/js/image_editor/exif_encoder_unittest.js b/ui/file_manager/gallery/js/image_editor/exif_encoder_unittest.js index 4afd939..95f5893 100644 --- a/ui/file_manager/gallery/js/image_editor/exif_encoder_unittest.js +++ b/ui/file_manager/gallery/js/image_editor/exif_encoder_unittest.js @@ -20,14 +20,39 @@ function testExifEncodeAndDecode() { id: 0x10f, format: 2, componentCount: 12, - value: 'Manufacture' + value: 'Manufacture\0' }, // Device model 272: { id: 0x110, format: 2, componentCount: 12, - value: 'DeviceModel' + value: 'DeviceModel\0' + }, + // GPS Pointer + 34853: { + id: 0x8825, + format: 4, + componentCount: 1, + value: 0 // The value is set by the encoder. + } + }, + exif: { + // Lens model + 42036: { + id: 0xa434, + format: 2, + componentCount: 10, + value: 'LensModel\0' + } + }, + gps: { + // GPS latitude ref + 1: { + id: 0x1, + format: 2, + componentCount: 2, + value: 'N\0' } } } @@ -56,14 +81,29 @@ function testExifEncodeAndDecode() { // Check ifd.image. assertEquals(1, parsedMetadata.ifd.image[0x112].value); // Orientation + // Since thumbnail is compressed with JPEG, compression must be 6. + assertEquals(6, parsedMetadata.ifd.image[0x102].value); + // Check ifd.exif. assertEquals(1920, parsedMetadata.ifd.exif[0xA002].value); // PixelXDimension assertEquals(1080, parsedMetadata.ifd.exif[0xA003].value); // PixelYDimension - // TODO(yawano) Change exif_encoder to preserve these fields. - // These fileds are not encoded. - assertEquals(undefined, parsedMetadata.ifd.image[0x10F]); // Manufacture - assertEquals(undefined, parsedMetadata.ifd.image[0x110]); // Device model + // These fields should be copied correctly. + // Manufacture + assertEquals('Manufacture\0', parsedMetadata.ifd.image[0x10F].value); + // Device model + assertEquals('DeviceModel\0', parsedMetadata.ifd.image[0x110].value); + // Lens model + assertEquals('LensModel\0', parsedMetadata.ifd.exif[0xa434].value); + // GPS latitude ref + assertEquals('N\0', parsedMetadata.ifd.gps[0x1].value); + + // Software should be set as Gallery.app + assertEquals('Chrome OS Gallery App\0', + parsedMetadata.ifd.image[0x131].value); + + // TODO(yawano): Datetime should be updated. + assertEquals(undefined, parsedMetadata.ifd.image[0x132]); // Datetime // Thumbnail image assert(parsedMetadata.thumbnailTransform); diff --git a/ui/file_manager/gallery/js/image_editor/image_encoder.js b/ui/file_manager/gallery/js/image_editor/image_encoder.js index 7b3ebf3..3c549a5 100644 --- a/ui/file_manager/gallery/js/image_editor/image_encoder.js +++ b/ui/file_manager/gallery/js/image_editor/image_encoder.js @@ -205,6 +205,10 @@ ImageEncoder.MetadataEncoder.getMimeType_ = function(metadata) { /** * Returns metadata. * @return {!Object} A metadata. + * + * TODO(yawano): MetadataEncoder.getMetadata seems not to be used anymore. + * Investigate this, and remove if possible. Should not modify a metadata by + * using an encoder. */ ImageEncoder.MetadataEncoder.prototype.getMetadata = function() { return this.metadata_; |