2016-04-04 7 views
2

UIImage işlevini kullanarak bir çift diziyi UIImage öğesine dönüştürmek mümkün müdür?Çift Düzeni UIImage ürününe dönüştürebilir

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

UIImage işlevi String için sorar. Diziyi münferit eleman üzerine dizgiye dönüştürmeyi denedim ve her şeyi dize getirdim, sonuçta bir sonuç aldım. Birisi yardım edebilir mi?

[Düzenleme:]

o benim problem üzerinde gerçekten net değilmiş gibi

. Daha açık yapmak gerekirse, matematiksel bir ifadeden & operatörünü numaralandıran ve tüm parçaları tek tek gösteren bir yazılım geliştiriyorum. Şimdi, Swift'e nasıl gideceğim? :

Adım-1: Sağlanmış gri tonlamalı bir resim var. UIImage işlevini kullanarak okudum. MATLAB ya da Python ya da C++ 'da yaptığımız gibi bir piksel düzeyini ele alabilmem için onu özel bir RGBA işlevine dönüştürüyorum. İşlev, birçok web sitesinin kullanımından ilham alır.

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 
} 

}

Adım 2: Şimdi resmin [Kırmızı bir kanal alabilir: tüm kanallar aynı olması beri, aldığı bir önemi yoktur çıktı] ve çekirdek boyut 5x5 özel medyan filtresini uygulayın.

Adım-3: Ardından, ortalama filtre ve standart sapma kullandığım Nibblack yaklaşımını kullanarak görüntünün binarizasyonunu yapıyorum.

Adım-4: Bundan sonra, görüntünün farklı bağlı bileşenlerini ayırmak için bağlı bileşen etiketlemeyi kullandım.

Adım-5: Son olarak, etiketli görüntüleri kesmem ve yeniden boyutlandırmam gerekiyor. Orijinal görüntüden kırpmak için akıllı bir konum algoritması kullanarak yeri biliyorum. Yeniden boyutlandırmak için Çekirdek Grafik Boyutlandırma filtresini kullanmak istiyorum. Bununla birlikte, şu anki çıktımı [iki boyutlu bir dizi veya düzleştirilmiş] UIImage veya CGImage'a dönüştürmem gerekiyor. Ben tip Array<Double> veya Array<Int> ait olan iki boyutlu bir dizi veya düzleşmiş diziden UIImage veya CGImage dönüştürmek nasıl: benim gerçek soru

?

+1

neden çift görüntü için kullanıyorsunuz? – Lee

+0

Zaman zaman, ortalama filtre uyguladıktan sonra görüntülerde yaptığımız hesaplama, Double (Çift) sonucunu verir. Int ile de başa çıkabilirim. Önemli olan UIImage'a dönüştürmektir. – Nasiba

+0

Gerçekten neyi başarmak istediğinizi bize anlatabilir misiniz? Burada bir [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) sorununu kokluyorum. – ozgur

cevap

1

bu deneyin:

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)")} 

haritası işlevi başka diziye dizinizi dönüştürecek.

var str:[String] = []; 

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

Ama neden bir UIImage için sayıların bir Dize geçerdi:

+0

Bunu denedim. Bir dizi var, bu doğru; ama dizi sıfırdır. – Nasiba

+0

Resim öğelerinizde resim adı 1.0.png, 2.0.png var mı? – Khuong

+0

Hayır. Bu sadece MATLAB matrisi veya python dizisinde yaptığımız gibi oluşturulan bir çift dizidir. UIImage veya CGImage'a (eğer mümkünse) dönüştürmek istiyorum, böylece onu görüntüleyebilir veya gelecekte kullanabilirim. – Nasiba

0

Sadece bu deneyin? Öğenizdeki resimler sayı olarak mı adlandırıldı?

0

Bir bitmap'e 1, 2, vb. Oluşturmak istediğiniz gibi görünüyor.

Önce bunu yapmak için bir işlev gerekir ve sonra bunu kullanarak çiftler dizisinde flatMap'i kullanın. Bu, görüntüleri oluşturmaya çalıştığımızda herhangi bir nil sonuç çıkarıyorsa, filtreleme yaparak güvenli bir şekilde bir dizi UIImages almanızı sağlayacaktır.

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) } 

Bu çalışmayı doğrulamak için oyun alanını kullanabilirsiniz. Ayrıca, gereksinimlerinizi karşılamak için uygun arka plan ve metin renkleri ve yazı tipi boyutu ayarlamak isteyebilirsiniz.

+0

Merhaba, ben sadece bir sayı koymak dışında bitmap oluşturmak istiyorum. Görüntü oluşturmak için değerleri çift diziye eklemek istiyorum. – Nasiba

+1

Kodum, her birinin aslında sayıyı çizdiği bitmapler oluşturur. İçindeki tüm sayıları görüntüleyen tek bir görüntü veya her sayı için bir resim isteyip istemediğinizden emin değilim. Benim çözümüm daha sonra yaratır. – Shripada

+0

Numaraların görüntülenmesini istemiyorum. Bunun yerine 3x3 matrisini veya düzleştirilmiş matrisi bir görüntüye dönüştürmek istiyorum. Görüntünün değerleri 0-255 arasında olacaktır. – Nasiba