如何从字节数组快速创建位图图像

Vinoth iOS版

我有一个来自指纹传感器设备的字节数组。我想用它创建一个位图。我已经尝试了一些示例,但是我得到的只是一个零UIImage。

如果有任何步骤可以,请告诉我。

谢谢。

这是我的func所做的:

func didFingerGrabDataReceived(data: [UInt8]) {
    if data[0] == 0 {
        let width1 = Int16(data[0]) << 8
        let finalWidth = Int(Int16(data[1]) | width1)

        let height1 = Int16(data[2]) << 8
        let finalHeight = Int(Int16(data[3]) | height1)

        var finalData:[UInt8] = [UInt8]()

// i dont want the first 8 bytes, so am removing it

        for i in 8 ..< data.count {
            finalData.append(data[i])
        }

     dispatch_async(dispatch_get_main_queue()) { () -> Void in

        let msgData = NSMutableData(bytes: finalData, length: finalData.count)

        let ptr = UnsafeMutablePointer<UInt8>(msgData.mutableBytes)


        let colorSpace = CGColorSpaceCreateDeviceGray()
        if colorSpace == nil {
            self.showToast("color space is nil")
            return
        }

        let bitmapContext = CGBitmapContextCreate(ptr, finalWidth, finalHeight, 8, 4 * finalWidth, colorSpace,  CGImageAlphaInfo.Only.rawValue);

        if bitmapContext == nil {
            self.showToast("context is nil")
            return
        }

        let cgImage=CGBitmapContextCreateImage(bitmapContext);
        if cgImage == nil {
            self.showToast("image is nil")
            return
        }

        let newimage = UIImage(CGImage: cgImage!)

            self.imageViewFinger.image = newimage
        }
}

我的图像失真了。有人请帮忙

这里的一个重要问题是,当您调用时CGBitmapContextCreate,您指定仅在构建一个Alpha通道时,data缓冲区显然使用了每个像素一个字节,但是指定了“每行字节数”参数4 * width应该是width当捕获每个像素四个字节(例如RGBA)时,通常使用4倍,但是由于缓冲区使用的是每个像素一个字节,因此应删除该4倍因子。


就个人而言,我还建议其他方面的改进,包括:

  • 唯一应分派到主队列的是UIKit控件的更新

  • 您可以退休finalData,因为您不需要从一个缓冲区复制到另一个缓冲区,而是可以msgData直接构建

  • 不过,您可能应该完全绕开自己的缓冲区的创建,并调用CGBitmapContextCreatewithnil作为data参数,在这种情况下,它将创建自己的缓冲区,您可以通过进行检索CGBitmapContextGetData如果将其传递给缓冲区,则假定您将自己管理该缓冲区,我们在此不做。

    如果您创建自己的缓冲区而没有适当地管理该内存,则在看起来可行的地方将遇到难以重现的错误,但是突然之间,您会在看起来相似的情况下无缘无故地看到缓冲区损坏。通过让Core Graphics管理内存,可以避免这些问题。

  • 我可能会将这个字节缓冲区的转换UIImage与的更新分开UIImageView

这样产生的结果如下:

func mask(from data: [UInt8]) -> UIImage? {
    guard data.count >= 8 else {
        print("data too small")
        return nil
    }

    let width  = Int(data[1]) | Int(data[0]) << 8
    let height = Int(data[3]) | Int(data[2]) << 8

    let colorSpace = CGColorSpaceCreateDeviceGray()

    guard
        data.count >= width * height + 8,
        let context = CGContext(data: nil, width: width, height: height, bitsPerComponent: 8, bytesPerRow: width, space: colorSpace, bitmapInfo: CGImageAlphaInfo.alphaOnly.rawValue),
        let buffer = context.data?.bindMemory(to: UInt8.self, capacity: width * height)
    else {
        return nil
    }

    for index in 0 ..< width * height {
        buffer[index] = data[index + 8]
    }

    return context.makeImage().flatMap { UIImage(cgImage: $0) }
}

接着

if let image = mask(from: data) {
    DispatchQueue.main.async {
        self.imageViewFinger.image = image
    }
}

对于Swift 2复制,请参阅此答案的先前版本

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何从字节数组创建位图?

来自分类Dev

Android NDK返回位图像素的字节数组

来自分类Dev

如何将字节数组转换为位图图像?

来自分类Dev

如何在wp7中将位图图像转换为字节数组?

来自分类Dev

如何将位图或字节数组转换为图像?

来自分类Dev

快速将图像转换为字节数组

来自分类Dev

字节数组移位产生的位图

来自分类Dev

字节数组移位产生的位图

来自分类Dev

如何快速将double转换为字节数组?

来自分类Dev

如何用自己的字节创建字节数组?

来自分类Dev

使用javascript从字节数组创建图像

来自分类Dev

javascript:从字节数组创建图像资源

来自分类Dev

如何创建一个包含真实图像的字节数组?

来自分类Dev

如何使用Glide通过字节数组加载图像?

来自分类Dev

McEliece(FlexiProvider):如何从字节数组创建KeyPair?

来自分类Dev

如何从bmp文件字节数组创建BitmapImage?

来自分类Dev

如何从字节数组的 JSON 元素创建文件

来自分类Dev

将位图图像转换为字节数组并存储到Mysql中

来自分类Dev

来自字节数组的图像

来自分类Dev

串联图像字节数组

来自分类Dev

图像到字节数组-ExternalException

来自分类Dev

什么是图像的字节数组?

来自分类Dev

编码图像到字节数组

来自分类Dev

从字节数组创建方法

来自分类Dev

从字节数组创建 XPS 文档

来自分类Dev

当字节数组的源是 jpg 时,从存储的字节数组创建位图并保存到磁盘会引发 GDI+ 异常

来自分类Dev

将字节数组或位图转换为图片

来自分类Dev

将位图数据提取到字节数组

来自分类Dev

jpeg ImageFormat字节数组到android中的位图