簡體   English   中英

快速將雙數組轉換為 UIImage

[英]Convert a Double Array to UIImage in swift

是否可以使用 UIImage 函數將雙數組轉換為 UIImage?

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

UIImage 函數需要字符串。 我嘗試將單個元素上的數組轉換為字符串,並將整個內容轉換為字符串,但結果為 nill。 有人可以幫忙嗎?

[編輯:]

看來我並不清楚我的問題。 為了更清楚,我正在開發一個軟件,它可以從數學表達式中裁剪數字和運算符,並逐個向我顯示所有塊。 現在,我該如何在 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 過濾器。 但是,為此我需要將當前輸出 [二維數組或扁平化] 轉換為 UIImage 或 CGImage。

那是我真正的問題:如何從二維數組或扁平數組( Array<Double>Array<Int>類型)轉換為 UIImage 或 CGImage ?

嘗試這個:

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 函數會將您的數組轉換為另一個數組。

試試這個:

var str:[String] = [];

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

但是為什么要將一串數字傳遞給 UIImage 呢? 資產中的圖像是否以數字命名?

看起來您想將 1、2 等渲染為位圖。

首先,您需要一個函數來執行此操作,然后使用 this 在雙精度數組上使用 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 來驗證此工作。 此外,您可能希望設置適當的背景和文本顏色以及字體大小以滿足您的要求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM