【问题标题】:Faster way of converting image hex dump to binary array in Swift在 Swift 中将图像十六进制转储转换为二进制数组的更快方法
【发布时间】:2016-11-17 13:14:55
【问题描述】:

我需要编辑图像的像素原始二进制值。为此,我执行了以下步骤:

  1. 我获得了包含图像十六进制转储的 CFData。

  2. 我将得到的CFData转换成字符数组(使用convertToArray函数)

  3. 之后,我使用 convertToBinaryString 函数获取一个字符串,该字符串表示十六进制转储的以 2 为底的值。

对于小文件,它确实有效,但对于较大的文件,它需要很长时间才能完成。我在寻找更快方法的斗争中失败了。你能帮帮我吗?

下面你可以看看我需要优化的功能:

func convertToArray(imageData : CFData) -> Array<Character>{
  let arrayData : Array<Character> = Array(String(NSData(data: imageData)).characters)
  print("Array : ")
  Swift.print(arrayData)
  return arrayData
}

func convertToBinaryString(array : Array<Character>) -> String{
    let numberOfChars = array.count
    var binaryString = convertHexToBinary(array[1])
    for character in 2...numberOfChars - 2{
        binaryString = binaryString + convertHexToBinary(array[character])
    }
    // print("BINARRY ARRAY : ")
    // print(binaryString)
    return binaryString

}

【问题讨论】:

  • 我很好奇,如果您最终想要在 0s 和 1s 中使用二进制表示,为什么将其存储在 String 中?
  • imageData 二进制数据。然后你用该数据的十六进制描述创建一个字符串,并再次提取字节......
  • 当您说您需要编辑原始二进制值时,您究竟是如何编辑它们的?您一次需要一定范围的值吗?
  • @ColGraff 对于某些像素,我想将二进制表示中的值 1 更改为 0。这就是我编辑它们的意思。
  • @MartinR,也许我无法表达我的想法。我需要“ 11111111111111111111111111111111 ”而不是“ ffffffff ”,并且对于某些像素,我想将一些值更改为 1 为 0。这是我的图像所需的“二进制数据”。

标签: arrays swift image hexdump cfdata


【解决方案1】:

我会尝试对NSData 进行此扩展,它提供CollectionType 接口。似乎它可以让您更轻松地进行修改,而无需使用UnsafeMutablePointer

Bytes collection for NSData

由于BytesViewMutableBytesViewCollectionType,它为您提供下标、索引等功能,因此您可以遍历数据并进行所需的更改。

与此问题相关并介绍该链接代码的文章:

NSData, My Old Friend

【讨论】:

  • 请注意,在 Swift 3 中,大部分都是内置的。新的 Data 结构是 MutableCollection。
  • 非常感谢!我将讲授你告诉我的内容,并尝试使用这些信息实现一种方法。
  • @RobNapier 我已经等不及了,Swift 3 将彻底改变现状并提供许多重大变化。哦,我希望你继续在你的博客上发帖,我从中学到了很多有用的技巧。谢谢!
猜你喜欢
  • 2023-04-05
  • 2016-12-25
  • 2018-01-21
  • 2012-06-26
  • 2020-09-10
  • 2016-08-28
  • 2013-07-25
相关资源
最近更新 更多