我有一个应用程序,允许用户从资产库中选择多个图像。我遇到的问题是,当我将图像从资产库“复制”到我应用程序库中的目录时,不会存储方向元数据。结果是图像有时会颠倒等......
以下是单元测试的代码。我已将代码简化并移动到单独的行中以便于调试。
这样可行,但不会复制元数据:
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?
答案 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()将解决你的问题。
希望它有所帮助。