Пиксельный массив для UIImage в Swift

Я пытался выяснить, как преобразовать массив данных пикселов rgb в UIImage в Swift.

Я сохраняю данные rgb на пиксель в простой структуре:

public struct PixelData { var a: Int var r: Int var g: Int var b: Int } 

Я перешел к следующей функции, но результирующее изображение неверно:

 func imageFromARGB32Bitmap(pixels:[PixelData], width: Int, height: Int)-> UIImage { let rgbColorSpace = CGColorSpaceCreateDeviceRGB() let bitmapInfo:CGBitmapInfo = CGBitmapInfo(CGImageAlphaInfo.PremultipliedFirst.rawValue) let bitsPerComponent:Int = 8 let bitsPerPixel:Int = 32 assert(pixels.count == Int(width * height)) var data = pixels // Copy to mutable [] let providerRef = CGDataProviderCreateWithCFData( NSData(bytes: &data, length: data.count * sizeof(PixelData)) ) let cgim = CGImageCreate( width, height, bitsPerComponent, bitsPerPixel, width * Int(sizeof(PixelData)), rgbColorSpace, bitmapInfo, providerRef, nil, true, kCGRenderingIntentDefault ) return UIImage(CGImage: cgim)! } 

Любые советы или указатели на то, как правильно преобразовать массив rgb в UIImage?

2 Solutions collect form web for “Пиксельный массив для UIImage в Swift”

Ваша единственная проблема заключается в том, что типы данных в вашей структуре PixelData должны быть UInt8 . Я создал тестовое изображение на игровой площадке со следующим:

 public struct PixelData { var a: UInt8 var r: UInt8 var g: UInt8 var b: UInt8 } var pixels = [PixelData]() let red = PixelData(a: 255, r: 255, g: 0, b: 0) let green = PixelData(a: 255, r: 0, g: 255, b: 0) let blue = PixelData(a: 255, r: 0, g: 0, b: 255) for _ in 1...300 { pixels.append(red) } for _ in 1...300 { pixels.append(green) } for _ in 1...300 { pixels.append(blue) } let image = imageFromARGB32Bitmap(pixels, width: 30, height: 30) 

Обновление для Swift 2.2:

Я обновил imageFromARGB32Bitmap для работы с Swift 2.2:

 func imageFromARGB32Bitmap(pixels:[PixelData], width: Int, height: Int)-> UIImage { let rgbColorSpace = CGColorSpaceCreateDeviceRGB() let bitmapInfo:CGBitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.PremultipliedFirst.rawValue) let bitsPerComponent = 8 let bitsPerPixel = 32 assert(pixels.count == width * height) var data = pixels // Copy to mutable [] let providerRef = CGDataProviderCreateWithCFData( NSData(bytes: &data, length: data.count * sizeof(PixelData)) ) let cgim = CGImageCreate( width, height, bitsPerComponent, bitsPerPixel, width * Int(sizeof(PixelData)), rgbColorSpace, bitmapInfo, providerRef, nil, true, .RenderingIntentDefault ) return UIImage(CGImage: cgim!) } 

Обновление для Swift 3

 struct PixelData { var a: UInt8 = 0 var r: UInt8 = 0 var g: UInt8 = 0 var b: UInt8 = 0 } func imageFromBitmap(pixels: [PixelData], width: Int, height: Int) -> UIImage? { assert(width > 0) assert(height > 0) let pixelDataSize = MemoryLayout<PixelData>.size assert(pixelDataSize == 4) assert(pixels.count == Int(width * height)) let data: Data = pixels.withUnsafeBufferPointer { return Data(buffer: $0) } let cfdata = NSData(data: data) as CFData let provider: CGDataProvider! = CGDataProvider(data: cfdata) if provider == nil { print("CGDataProvider is not supposed to be nil") return nil } let cgimage: CGImage! = CGImage( width: width, height: height, bitsPerComponent: 8, bitsPerPixel: 32, bytesPerRow: width * pixelDataSize, space: CGColorSpaceCreateDeviceRGB(), bitmapInfo: CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedFirst.rawValue), provider: provider, decode: nil, shouldInterpolate: true, intent: .defaultIntent ) if cgimage == nil { print("CGImage is not supposed to be nil") return nil } return UIImage(cgImage: cgimage) } 
  • Изменение размера UIImage - Проблемы с производительностью
  • Как изменить размер изображения в iOS?
  • Получите обратно данные UIImage после сохранения их в библиотеке фотографий в iOS
  • Линия UIImageInrect: сглаживание изображения
  • iOS Capture, затем обрезайте и замаскируйте изображение результата
  • layer.renderInContext не учитывает layer.mask?
  • конвертировать jpg UIImage в bitmap UIImage?
  • UIImageView получает позицию показа изображения
  • UIImage из делегата AVCaptureMetadataOutput (didOutputMetadataObjects)
  • Swift: создание массива UIImage
  • обнаружение лица iOS с камеры
  • Interesting Posts

    didEnterRegion of LocationManager не вызвал никогда

    Сделать UICollectionViewCell в центре UICollectionView

    Сохранение правильных оттенков после маскировки изображений

    iOS SQLite медленная производительность

    как добавить пользовательскую клавиатуру

    Как сделать инъекцию зависимостей для контроллера представления на первом экране при использовании раскадровки?

    UIWebView не охватывает весь вид в ландшафтном режиме

    удалить объект из NSMutableArray

    Ошибка приложения с + : проблема?

    UIApplication sharedApplication продолжает выполнение при возврате в приложение и перезагрузке

    Как узнать, сохраняется ли изображение в кэше на Watch

    Пользовательский вид ячейки таблицы с исключением исключения xib на ios 8

    Не удается распространять мое приложение: «Ваше приложение содержит непубличное использование API».

    Как воспроизводить видео youtube / vimeo в приложении в iPhone

    Показать клавиатуру UITextField на первом реестре, даже если userInteractionEnabled = NO

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.