monotouch资产库定位

时间:2013-02-12 19:35:26

标签: xamarin.ios orientation alassetslibrary

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

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

这样可行,但不会复制元数据:

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为null,当我在调试中查看UIImage上的CGImage数据时,我注意到它是null。我注意到方向确实正确地传递给了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?

1 个答案:

答案 0 :(得分: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()将解决你的问题。

希望它有所帮助。