2016-01-25 2 views
2

Код ниже пытается установить пиксели в автономный растровый рисунок и нарисовать растровое изображение на экране. К сожалению, он падает.Рисование пикселей на экране с использованием CoreGraphics в Swift

import UIKit 

class GameView: UIView { 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
    } 


    func createBitmapContext(pixelsWide: Int, _ pixelsHigh: Int) -> CGContextRef? { 
     let bytesPerPixel = 4 
     let bytesPerRow = bytesPerPixel * pixelsWide 
     let bitsPerComponent = 8 

     let byteCount = (bytesPerRow * pixelsHigh) 

     let colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB) 

     let pixels = UnsafeMutablePointer<CUnsignedChar>.alloc(byteCount) 
     if pixels == nil { 
      return nil 
     } 
     let bitmapInfo = CGImageAlphaInfo.PremultipliedFirst.rawValue | CGBitmapInfo.ByteOrder32Little.rawValue 

     let context = CGBitmapContextCreate(pixels, pixelsWide, pixelsHigh, bitsPerComponent, bytesPerRow, colorSpace, bitmapInfo) 

     return context 
    } 

    override func drawRect(rect: CGRect) { 
     let width = 200 
     let height = 300 
     let boundingBox = CGRectMake(0, 0, CGFloat(width), CGFloat(height)) 
     let context = createBitmapContext(width, height) 

     let data = CGBitmapContextGetData(context) 
     var currentPixel: [UInt32] = unsafeBitCast(data, [UInt32].self) 

     var n = 0 
     for var j = 0; j < height; j++ { 
      for var i = 0; i < width; i++ { 
       currentPixel[n++] = 0 
      } 
     } 

     let image = CGBitmapContextCreateImage(context!) 
     CGContextDrawImage(context!, boundingBox, image) 
    } 

} 

ответ

3

Необходимо внести несколько изменений. 1. Сбой из-за переполнения памяти. 2. Вы создаете образ из вновь созданного контекста и записываете в тот же контекст вместо текущего контекста рисования.

Используйте этот модифицированный DrawRect Функция:

override func drawRect(rect: CGRect) { 
    let width = 200 
    let height = 300 
    let boundingBox = CGRectMake(0, 0, CGFloat(width), CGFloat(height)) 
    let context = createBitmapContext(width, height) 

    let data = CGBitmapContextGetData(context) 

    let pixels = UnsafeMutablePointer<CUnsignedChar>(data) 
    var n = 0 
    for var j = 0; j < height; j++ { 
     for var i = 0; i < width; i++ { 
      pixels[n++] = 0 //B 
      pixels[n++] = 255 //G 
      pixels[n++] = 0 //R 
      pixels[n++] = 255 //A 
     } 
    } 
    let image = CGBitmapContextCreateImage(context!) 
    if let currentContext: CGContext! = UIGraphicsGetCurrentContext() { 
     UIImagePNGRepresentation(UIImage(CGImage:image!))?.writeToFile("/Users/admin/Desktop/aaaaa.png", atomically: true) 
     CGContextDrawImage(currentContext, boundingBox, image) 
    } 
} 
+0

Я предполагаю, что мне не нужен вызов UIImagePNGRepresentation? Кроме того, я выделил bytesPerPixel = 4 и позже, используя приведение к UInt32, поэтому я не понимаю, почему происходит сбой памяти. Создан ли ваш контекст по умолчанию в BGRA? – Laurent

+1

Не нужно вызывать UIImagePNGRпредставление. Я добавил только для целей тестирования. Вы можете удалить это. CBCitmapContextCreate по умолчанию - BGRA. –