Xamarin.iOS中如何将ImageSource或图片字节数组转为NSUrl/CGImage
在Xamarin.iOS中转换图片源/字节数组为NSUrl或CGImage并实现打印
一、从字节数组转换为CGImage
你已经通过LayoutToImage()获取了布局的字节数组,可直接将其转为UIImage后提取CGImage:
public CGImage ConvertBytesToCGImage(byte[] imageBytes) { // 将字节数组转换为NSData using (var data = NSData.FromArray(imageBytes)) { // 从NSData实例化UIImage var uiImage = UIImage.LoadFromData(data); // 返回对应的CGImage return uiImage.CGImage; } }
二、从字节数组转换为NSUrl
因为你的打印方法需要指向本地文件的NSUrl,所以需先将字节数组写入临时文件,再生成文件路径对应的NSUrl:
public NSUrl ConvertBytesToNSUrl(byte[] imageBytes) { // 获取iOS临时目录路径 var tempDir = Path.GetTempPath(); // 生成唯一临时文件名,避免重复 var tempFileName = $"Print_Temp_{Guid.NewGuid()}.png"; var tempFilePath = Path.Combine(tempDir, tempFileName); // 将字节数组写入临时文件 File.WriteAllBytes(tempFilePath, imageBytes); // 返回文件对应的NSUrl return NSUrl.FromFilename(tempFilePath); }
三、从ImageSource转换为CGImage或NSUrl
如果是Xamarin.Forms的ImageSource,需先通过ImageLoaderSourceHandler转为UIImage,再做后续转换:
转CGImage
public async Task<CGImage> ConvertImageSourceToCGImage(ImageSource imageSource) { var handler = new ImageLoaderSourceHandler(); var uiImage = await handler.LoadImageAsync(imageSource); return uiImage.CGImage; }
转NSUrl
public async Task<NSUrl> ConvertImageSourceToNSUrl(ImageSource imageSource) { var handler = new ImageLoaderSourceHandler(); var uiImage = await handler.LoadImageAsync(imageSource); using (var imageData = uiImage.AsPNG()) { byte[] bytes = new byte[imageData.Length]; System.Runtime.InteropServices.Marshal.Copy(imageData.Bytes, bytes, 0, (int)imageData.Length); // 复用字节数组转NSUrl的方法 return ConvertBytesToNSUrl(bytes); } }
四、整合到打印流程
将转换后的NSUrl直接传入你的打印代码即可:
// 获取布局字节数组 var layoutImageBytes = LayoutToImage(); // 转换为打印所需的NSUrl var printFileUrl = ConvertBytesToNSUrl(layoutImageBytes); // 执行打印 var error = Driver.PrintImageWithURL(printFileUrl, pSettings); // 打印完成后可删除临时文件,释放存储空间 File.Delete(printFileUrl.Path);
内容的提问来源于stack exchange,提问作者Xamarin
相关产品推荐
相关产品推荐

