none
Metro App 如何无损旋转JPEG图片 RRS feed

  • 问题

  • 大家好,

    我目前遇到一个Photo旋转后,数据丢失的问题。

    我的一个JPEG图片数据中,含有音频信息,在进行旋转后,发现其中的音频信息丢失,图片Size变小。

    第一种方式,使用了SetPropertiesAsync方式,修改Exif信息。第二种方式,直接使用BitmapTransform旋转。

    以上两种方式,均导致JPEG中的音频信息丢失。

    使用了Windows8自带的Photos软件,可以正常旋转,并且数据无丢失。

    Photos的解决方案可能是什么呢?直接通过解析JPEG的方式修改Exif中的Rotation信息?

    各位,是否有啥解决方案,请赐教。

    PS:怀疑=>JPEG格式最后的字段记录了音频信息,在最开始使用Decoder时,音频信息就没有被获取。



    • 已编辑 li_yb 2014年7月22日 9:25
    2014年7月22日 2:29

答案

  • 你好,更深入的东西我也不是很清楚啦,不过我把我的想法写在这里讨论一下。

    带有音频信息的图片本身应该不是正常规格的图片,而是像加密过的JPEG一样,或许你可以找到对应的音频内容,然后把他加在新图片里面。

    参考了下JPEG图片的格式:http://blog.csdn.net/lpt19832003/article/details/1713718以及Exif在JPEG中存在的位置(http://baike.baidu.com/view/22006.htm),我认为你可以搜索一下之间的内容,看样子非常麻烦。

    我感觉Win8系统自带的Photo应该不会用到这么复杂的代码来保存某个文件吧。

    --James


    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    2014年7月23日 8:39
    版主
  • ?????

    2014年7月23日 10:50

全部回复

  • 你好 li_yb,

    另外有个问题,你是通过Store App来旋转图片,然后再把图片保存回去么?

    你可以share一个带有音频信息的图片给我让我来做一下测试吗?

    --James


    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    2014年7月22日 8:32
    版主
  • >>另外有个问题,你是通过Store App来旋转图片,然后再把图片保存回去么?

    是的。用的两种方法都需要Encoder和Decoder进行,就相当于将源文件流读出修改后又存入源文件。

    >>一个带有音频信息的图片给我让我来做一下测试吗?

    非常抱歉,现有的图片涉及信息安全问题,暂不能共享。

    如果方便的话,你可以把你想要测试的内容提供给我,我验证后,共享结论给你。

    2014年7月22日 9:06
  • 好的,我的意思是你随便拿一张图片,然后往里面加任意的音频,然后发给我测试一下,并不需要你含有信息安全的那个图片。

    首先使用BitmapTransform的话,请看文档:GetPixelDataAsync(BitmapPixelFormat, BitmapAlphaMode, BitmapTransform, ExifOrientationMode, ColorManagementMode) | getPixelDataAsync(BitmapPixelFormat, BitmapAlphaMode, BitmapTransform, ExifOrientationMode, ColorManagementMode) method,的意思是说获取所有pixel的data,所以你的猜测应该是正确的,其他数据会被过滤掉。

    至于,我看了下文档,也写了段代码,发现System.Photo.Orientation 是只读属性,不可以被写入。

                var file = await KnownFolders.PicturesLibrary.GetFileAsync("0.jpg");
                var imageProperties = await file.Properties.GetDocumentPropertiesAsync();
                string imageOrientation = "System.Photo.Orientation";
                List<string> propertiesName = new List<string>();
                propertiesName.Add(imageOrientation);
                IDictionary<string, object> extraProperties = await file.Properties.RetrievePropertiesAsync(propertiesName);
                var propValue = extraProperties[imageOrientation];
                extraProperties[imageOrientation] = 8;
                //var propertyToSave = new List<string, string> { new KeyValuePair("System.Photo.LensManufacturer", "Pentax") };
    
                await file.Properties.SavePropertiesAsync(extraProperties);

    如果你能提供一下图片的话,我想对图片进行一下分析,看是否可以从数据流里面直接截取出有关图片的部分,然后进行旋转后保存。

    -James


    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    2014年7月22日 12:10
    版主
  • 非常感谢您的答复,

    目前这种带有音频信息的图片是使用相机照出来的,我不清楚自己制作的是否可以替代。

    我们现在想到的解决方案,是通过读取二进制文件方式找到Exif信息中的Orientation信息,然后进行修改。但这样可能涉及到JPEG文件格式解析。工作量较大。

    >>如果你能提供一下图片的话,我想对图片进行一下分析,看是否可以从数据流里面直接截取出有关图片的部分,然后进行旋转后保存。

    如果只截取数据流里的图片部分,会不会导致图片的Exif信息与图片不符的问题?并且图片的缩略图是否有可能与原图不一致?

    2014年7月23日 2:41
  • 你好,更深入的东西我也不是很清楚啦,不过我把我的想法写在这里讨论一下。

    带有音频信息的图片本身应该不是正常规格的图片,而是像加密过的JPEG一样,或许你可以找到对应的音频内容,然后把他加在新图片里面。

    参考了下JPEG图片的格式:http://blog.csdn.net/lpt19832003/article/details/1713718以及Exif在JPEG中存在的位置(http://baike.baidu.com/view/22006.htm),我认为你可以搜索一下之间的内容,看样子非常麻烦。

    我感觉Win8系统自带的Photo应该不会用到这么复杂的代码来保存某个文件吧。

    --James


    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    2014年7月23日 8:39
    版主
  • ?????

    2014年7月23日 10:50
  • 非常感谢您的帮忙。

    我们打算使用托管C++尝试直接修改Exif中的Orientation信息。

    2014年7月24日 6:41
  • 非常感谢您的答复。

    您给的WIC是解决问题的一个非常好的方向,我们后续打算调查一下。

    再次感谢。


    • 已编辑 li_yb 2014年7月24日 6:44 措辞修改
    2014年7月24日 6:43