You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 22:55:25