在Swift中将双精度数组转换为UIImage

4
能否使用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
}

步骤二:我选择图像的一个通道进行处理 [红色通道:无论选择哪个通道,因为所有通道的输出都相同],并应用我的自定义中值滤波器,核大小为5x5。

步骤三:接下来,我使用Nibblack方法对图像进行二值化处理,其中我使用了平均滤波器和标准差。

步骤四:之后,我使用连通组件标记算法将图像的不同连通组件分离出来。

步骤五:最后,我需要裁剪标记的图像并调整大小。对于从原始图像中裁剪,我使用智能定位算法确定位置。对于调整大小,我想使用Core Graphics调整大小滤镜。然而,为此我需要将当前输出 [一个二维数组或扁平化数组,类型为 Array<Double>Array<Int>] 转换为 UIImage 或 CGImage。

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


1
你为什么要使用双精度浮点数来处理图像? - Lee
因为有时候,我们在应用平均滤波器后对图像进行的计算会得到Double类型的结果。我也可以处理Int类型的结果。关键是将其转换为UIImage类型。 - Nasiba
那可能是一个可能性!对此我感到抱歉!然而,我想要实现的事情是:我想能够转换为Swift现有的图像类型之一(UIImage或CGImage),以便我可以使用CG滤镜。但是我有一个Double数据类型的数组,其中该数组肯定是从原始图像(即2D数组)中压平的。 - Nasiba
你能否提供一个数组的真实例子?我们在谈论多大的数组?也许可以提供一些获取数组的代码。 - user887210
好的,我现在明白你想做什么了。你有一个值数组,想要从中构建一张图片。这些值的范围是多少,0...255?它是单通道还是多通道?如果是多通道,那么它们在数组中是如何排列的,交错还是顺序,并且是否有 alpha 通道?最终图像的尺寸是多少? - user887210
显示剩余3条评论
3个回答

0

试试这个:

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函数将把你的数组转换成另一个数组。


我尝试过了。我得到了一个数组,这是正确的;但是这个数组是空的。 - Nasiba
你的图像资源包含命名为1.0.png、2.0.png...的图片吗? - Twitter khuong291
不,这只是像我们在MATLAB矩阵或Python数组中创建的双重数组。我想将它转换为UIImage或CGImage(如果可能),以便我可以查看它或在将来使用。 - Nasiba
我认为如果您在图像资源中有一些图像,则会创建一个图像数组,否则,图像数组将为nil。 - Twitter khuong291

-1

只需试试这个:

var str:[String] = [];

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

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


-1

看起来你想将1、2等渲染成位图。

首先,你需要一个函数来完成这个任务,然后使用该函数对双精度数组进行 flatMap 操作。这将确保你以安全的方式获取 UIImage 数组,通过过滤在创建图像时出现的任何 nil 结果。

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来验证其工作情况。此外,您可能希望设置适合您要求的正确背景、文本颜色和字体大小。


嗨,我只想创建位图而不是放置数字。我想把双精度数组中的值放入其中以创建图像。 - Nasiba
1
我的代码生成位图,每个位图实际上绘制了一个数字。我不确定您是想要一个显示所有数字的单个图像,还是为每个数字创建一个图像。我的解决方案是创建后者。 - Shripada
我不想显示数字。相反,我想将一个3x3矩阵或平铺的矩阵转换成图像。图像的值将介于0-255之间。 - Nasiba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接