如何在 Xamarin iOS 中将 CGBitmap 的像素数据作为字节 [] 获取

Posted

技术标签:

【中文标题】如何在 Xamarin iOS 中将 CGBitmap 的像素数据作为字节 [] 获取【英文标题】:How to get pixel data of CGBitmap as byte[] in Xamarin iOS 【发布时间】:2017-06-20 16:30:55 【问题描述】:

我有CGBitmap 实例(每像素32 位),我想在byte[] 中获取图像数据。

字节数组应该获取 ARGB 格式的值,因此前 4 个字节对应于图像字节中每个 alpha、红色、绿色和蓝色的第一个像素strong> 价值观。

【问题讨论】:

检查这个:***.com/questions/448125/… 如果不够清楚,请告诉我,我会为您提供示例代码 【参考方案1】:

这是一个想法。图片是 UIImage

        CGImage imageRef = image.CGImage;
        int width = (int)image.Size.Width;
        int height = (int)image.Size.Height;
        CGColorSpace colorSpace = CGColorSpace.CreateDeviceRGB();
        byte[] rawData = new byte[height * width * 4];
        int bytesPerPixel = 4;
        int bytesPerRow = bytesPerPixel * width;
        int bitsPerComponent = 8;
        CGContext context = new CGBitmapContext(rawData, width, height,
                        bitsPerComponent, bytesPerRow, colorSpace,
                        CGBitmapFlags.PremultipliedLast | CGBitmapFlags.ByteOrder32Big);

        context.DrawImage((CGRect)new CGRect(0, 0, width, height), (CGImage)imageRef);     

        // Now your rawData contains the image data in the RGBA8888 pixel format.
        int pixelInfo = (width * y + x) * 4; // The image is png
        //red,green, blue,alpha
        byte red = rawData[pixelInfo];
        byte green = rawData[pixelInfo+1];
        byte blue = rawData[pixelInfo+2];
        byte alpha = rawData[pixelInfo + 3];

【讨论】:

它就像一个魅力!我不明白为什么它会起作用,因为我使用的是 ARGB8888,而不是 RGBA8888。您确定字节按您在回答中所说的方式排序吗? 好的,现在您的代码(最后一部分)中似乎有一部分可以重新排序字节。但是,它只针对一个像素进行(同样的事情应该应用于每个像素)。难道没有更好的方法吗? 也许使用 CGBitmapFlags.PremultipliedFirst 就足够了? 我的任务是找到特定像素的颜色。您可以尝试其他方式。

以上是关于如何在 Xamarin iOS 中将 CGBitmap 的像素数据作为字节 [] 获取的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 c# 在 Xamarin.Ios 中将 UIColor 转换为字符串和字符串转换为 UIColor

无法在 Xamarin iOS 应用程序中将文本共享到电子邮件或短信中

如何以 xamarin 形式将一个内容页面从客户端项目(IOS/Android)导航到另一个内容页面?

如何在 Android 应用程序中将 iCloud 日历与 xamarin 同步?

如何在 Xamarin 中将 View 绑定到 ViewCell

在 Xamarin.Forms 中将默认的深色 Android 主题更改为白色?