【问题标题】:Convert a Double Array to UIImage in swift快速将双精度数组转换为 UIImage
【发布时间】:2016-07-23 10:48:51
【问题描述】:

是否可以使用 UIImage 函数将双精度数组转换为 UIImage?

var ImageDouble = [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0]

UIImage 函数请求字符串。我尝试将单个元素上的数组转换为字符串,并将整个内容转换为字符串,但结果为零。有人可以帮忙吗?

[编辑:]

看来我并不清楚我的问题。为了更清楚,我正在开发一个软件,它可以从数学表达式中裁剪数字和运算符,并一个一个地向我展示所有块。现在,我该如何在 Swift 中处理它? :

第 1 步:我提供了一张灰度图像。我使用 UIImage 函数阅读它。我将其转换为自定义 RGBA 函数,如下所示,这样我就可以像在 MATLAB、Python 或 C++ 中那样处理像素级别。该功能的灵感来自许多网站的使用建议。

struct Pixel {
var value: UInt32
var red: UInt8 {
    get { return UInt8(value & 0xFF) }
    set { value = UInt32(newValue) | (value & 0xFFFFFF00) }
}
var green: UInt8 {
    get { return UInt8((value >> 8) & 0xFF) }
    set { value = (UInt32(newValue) << 8) | (value & 0xFFFF00FF) }
}
var blue: UInt8 {
    get { return UInt8((value >> 16) & 0xFF) }
    set { value = (UInt32(newValue) << 16) | (value & 0xFF00FFFF) }
}
var alpha: UInt8 {
    get { return UInt8((value >> 24) & 0xFF) }
    set { value = (UInt32(newValue) << 24) | (value & 0x00FFFFFF) }
}

}

struct RGBA {
var pixels: UnsafeMutableBufferPointer<Pixel>
var width: Int
var height: Int
init?(image: UIImage) {
    guard let cgImage = image.CGImage else { return nil }
    width = Int(image.size.width)
    height = Int(image.size.height)
    let bitsPerComponent = 8
    let bytesPerPixel = 4
    let bytesPerRow = width * bytesPerPixel
    let imageData = UnsafeMutablePointer<Pixel>.alloc(width * height)
    let colorSpace = CGColorSpaceCreateDeviceRGB()
    var bitmapInfo: UInt32 = CGBitmapInfo.ByteOrder32Big.rawValue
    bitmapInfo |= CGImageAlphaInfo.PremultipliedLast.rawValue & CGBitmapInfo.AlphaInfoMask.rawValue
    guard let imageContext = CGBitmapContextCreate(imageData, width, height, bitsPerComponent, bytesPerRow, colorSpace, bitmapInfo) else { return nil }
    CGContextDrawImage(imageContext, CGRect(origin: CGPointZero, size: image.size), cgImage)
    pixels = UnsafeMutableBufferPointer<Pixel>(start: imageData, count: width * height)
}

func toUIImage() -> UIImage? {
    let bitsPerComponent = 8
    let bytesPerPixel = 4
    let bytesPerRow = width * bytesPerPixel
    let colorSpace = CGColorSpaceCreateDeviceRGB()
    var bitmapInfo: UInt32 = CGBitmapInfo.ByteOrder32Big.rawValue
    bitmapInfo |= CGImageAlphaInfo.PremultipliedLast.rawValue & CGBitmapInfo.AlphaInfoMask.rawValue
    let imageContext = CGBitmapContextCreateWithData(pixels.baseAddress, width, height, bitsPerComponent, bytesPerRow, colorSpace, bitmapInfo, nil, nil)
    guard let cgImage = CGBitmapContextCreateImage(imageContext) else {return nil}
    let image = UIImage(CGImage: cgImage)
    return image
}

}

第 2 步:现在我采用图像的一个通道 [红色:我采用哪个通道都没有关系,因为所有通道都有相同的输出] 并应用我自定义的内核大小为 5x5 的中值滤波器。

第 3 步:接下来,我使用 Nibblack 近似对图像进行二值化,其中我使用了平均滤波器和标准差。

Step-4:之后,我使用连通分量标记来分离出图像的不同连通分量。

第 5 步:最后,我需要裁剪标记的图像并调整其大小。对于从原始图像进行裁剪,我使用智能定位算法知道位置。对于调整大小,我想使用 Core Graphics Resizing filter。但是,为此我需要将当前输出 [二维数组或扁平化] 转换为 UIImage 或 CGImage。

这是我真正的问题:如何从 Array&lt;Double&gt;Array&lt;Int&gt; 类型的二维数组或扁平数组转换为 UIImage 或 CGImage?

【问题讨论】:

  • 你为什么使用双倍的图像?
  • 因为有时,我们在应用平均过滤器后对图像进行的计算会得到双倍的结果。我也可以处理 Int。重点是将其转换为 UIImage。
  • 您能描述一下您真正想要实现的目标吗?我在这里闻到了XY 的问题。
  • 有可能!为此我深表歉意!但是,我想要实现的目标是:我希望能够转换为 Swift 现有的图像类型之一(UIImage 或 CGImage),以便我可以使用 CG 过滤器。但是我有一个 Double 数据类型的数组,其中的数组肯定是从原始图像中展平的,这是一个 2D 数组。
  • 你能发布一个数组的真实例子吗?我们在这里谈论的数组有多大?也许一些关于如何获取数组的代码。

标签: ios arrays string swift image-processing


【解决方案1】:

试试这个:

var ImageDouble = [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0]
let images = ImageDouble.map{ UIImage(named: "\($0)")}

map 函数会将您的数组转换为另一个数组。

【讨论】:

  • 我试过这个。我有一个数组,这是正确的;但数组是空的。
  • 您的图片资源是否包含图片名称 1.0.png、2.0.png...?
  • 没有。这只是我们在 MATLAB 矩阵或 python 数组中创建的双精度数组。我想将其转换为 UIImage 或 CGImage(如果可能),以便我可以查看它或将来可能会使用它。
  • 我认为如果你的图像资产中有一些图像,它会创建一个图像数组,如果没有,图像数组将为 nil。
【解决方案2】:

试试这个:

var str:[String] = [];

for (var i=0;i<ImageDouble.count;i++){
   str.append(String(ImageDouble[i]));
}
print(str)

但是你为什么要将一串数字传递给 UIImage 呢?您资产中的图像是否以数字命名?

【讨论】:

    【解决方案3】:

    看起来您想将 1、2 等渲染到位图中。

    首先,您需要一个函数来执行此操作,然后使用该函数在双精度数组上使用 flatMap。这将通过在我们尝试创建图像时过滤是否有任何 nil 结果来确保您以安全的方式获得 UIImages 数组。

    func createNumberImage(number:Double) -> UIImage?{
    
        //Set a frame that you want.
        let frame = CGRect(x: 0, y: 0, width: 200, height: 200)
        let view = UIView(frame:frame )
        view.backgroundColor = UIColor.redColor()
    
        let label = UILabel(frame:frame)
        view.addSubview(label)
    
        label.font  = UIFont.systemFontOfSize(100);
        label.text = String(format: "%.1lf", arguments:[number])
        label.textAlignment = NSTextAlignment.Center
        view
    
        UIGraphicsBeginImageContext(view.bounds.size);
        view.layer.renderInContext(UIGraphicsGetCurrentContext()!)
        let screenShot = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    
        return screenShot
    }
    
    let doubles = [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0]
    
    //Get the array of UIImage objects.  
    let images = doubles.flatMap { createNumberImage($0) }
    

    您可以使用 Playground 来验证这项工作。此外,您可能需要设置适当的背景和文本颜色以及字体大小以满足您的要求。

    【讨论】:

    • 您好,我只想创建位图,除了放一个数字。我想将值放入 double 数组中以创建图像。
    • 我的代码生成位图,其中每一个都实际绘制数字。我不确定您是想要一张显示其中所有数字的图像,还是每个数字都显示一张图像。我的解决方案创建了后者。
    • 我不想显示数字。相反,我想将 3x3 矩阵或扁平矩阵转换为图像。图像的值将介于 0-255 之间。
    猜你喜欢
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 2011-07-07
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多