A është e mundur të konvertohet një grup i dyfishtë në UIImage duke përdorur funksionin UIImage?
var ImageDouble = [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0]
Funksioni UIIimage kërkon String. Provova ta konvertoja grupin e elementit individual në vargje dhe të gjithën në varg, marr një rezultat zero. Mund të ndihmojë dikush?
[Redakto:]
Siç duket, nuk e kisha të qartë problemin tim. Për ta bërë më të qartë, unë po zhvilloj një softuer i cili pret numrat dhe operatorët nga një shprehje matematikore dhe më tregon të gjitha pjesët një nga një. Tani, si mund ta bëj këtë në Swift? :
Hapi-1: Kam dhënë një imazh në shkallë gri. E lexova duke përdorur funksionin UIImage. Unë e konvertoj atë në një funksion të personalizuar RGBA si më poshtë, në mënyrë që të mund të trajtoj një nivel pixel siç bëjmë në MATLAB ose Python ose C++. Funksioni është frymëzuar nga sugjerimet e shumë faqeve të internetit për ta përdorur atë.
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
}
}
Hapi-2: Tani marr një kanal të imazhit [E kuqe: nuk ka rëndësi se cilin e marr, pasi të gjitha kanalet kanë të njëjtin dalje] dhe aplikoj filtrin tim mesatar të personalizuar të madhësisë së kernelit 5x5.
Hapi 3: Më pas, bëj binarizimin e figurës duke përdorur përafrimin Nibblack, ku përdora filtrin mesatar dhe devijimin standard.
Hapi-4: Pas kësaj, përdora etiketimin e komponentëve të lidhur për të ndarë përbërës të ndryshëm të lidhur të imazhit.
Hapi-5: Më në fund, më duhet të pres imazhet e etiketuara dhe t'i ndryshoj përmasat e tyre. Për prerjen nga imazhi origjinal, unë e di vendndodhjen duke përdorur një algoritëm të zgjuar të vendndodhjes. Për ndryshimin e përmasave, unë dua të përdor filtrin Core Graphics Resizing. Megjithatë, për këtë më duhet të konvertoj daljen time aktuale [një grup dy-dimensional ose të rrafshuar] në UIImage ose CGImage.
Kjo është pyetja ime e vërtetë: Si të konvertoj në UIImage ose CGImage nga grupi dydimensional ose grupi i rrafshuar që janë të tipit Array<Double>
ose Array<Int>
?