2

我有一个应用程序,允许用户从资产库中选择多个图像。我遇到的问题是,当我将图像从资产库“复制”到应用程序库中的目录时,没有存储方向元数据。结果是图像有时是颠倒的等等......

下面是来自单元测试的代码。我已将代码简化并移到单独的行中,以便于调试。

这有效,但不复制元数据:

private void getAssetFromURL(ALAsset asset) 
{
    NSError fileError;

    ALAssetRepresentation rep = asset.DefaultRepresentation;

    CGImage cgi = rep.GetImage();
    UIImage img = UIImage.FromImage(cgi);
    NSData jpegData = img.AsJPEG();
    jpegData.Save(pathToSave,true,out fileError);
}

如果我更改代码以包含方向,则会收到对象引用错误。jpegData 为空,当我在调试中查看 UIImage 上的 CGImage 数据时,我注意到它为空。我确实注意到方向确实正确传递给了 UIImage 。

private void getAssetFromURL(ALAsset asset) 
{
    NSError fileError;

    ALAssetRepresentation rep = asset.DefaultRepresentation;

    UIImageOrientation orientation = UIImageOrientation.Up;
    if (rep.Orientation != null && rep.Orientation != ALAssetOrientation.Up)
        orientation = (UIImageOrientation)rep.Orientation;

    CGImage cgi = rep.GetImage();
    UIImage img = UIImage.FromImage(cgi,rep.Scale,orientation);
    NSData jpegData = img.AsJPEG();  //data is null
    jpegData.Save(pathToSave,true,out fileError);  //throws object reference error
}

我究竟做错了什么?有没有一种简单的方法,无需旋转图像即可将方向传递给 JPEG?

4

1 回答 1

0

你为什么不尝试做以下事情,我从来没有遇到过这样的方向问题。

UIImageOrientation orientation = UIImageOrientation.Up;
ALAssetRepresentation assetRep = asset.DefaultRepresentation;
CGImage imgRef = assetRep.GetFullScreenImage ();
orientation = (UIImageOrientation)assetRep.Orientation;
UIImage Image = new UIImage(imgRef,1.0f,orientation);

using (NSData imageData = img.AsJPEG()) 
{
     Byte[] myByteArray = new Byte[imageData.Length];
     System.Runtime.InteropServices.Marshal.Copy(imageData.Bytes, myByteArray, 0, Convert.ToInt32(imageData.Length));
     string pathToSave = ""; //Assign your path
     if(!File.Exists(pathToSave))
     {
     File.WriteAllBytes (pathToSave, myByteArray);
     }
}

还有一件事,我认为如果您使用assetRep.GetFullScreenImage () 而不是assetRep.GetImage () 将解决您的问题。

希望能帮助到你。

于 2014-04-09T06:50:24.753 回答