So rendern Sie Bitmap auf Offscreen -Bitmap und den Bildschirm mit Core -Grafiken zum Bildschirm

StackOverflow https://stackoverflow.com/questions/410313

Frage

Ich möchte eine Offscreen -Bitmap (oder eine Array von RGBA -Werten) rendern und dann diese zu einem UIView In der Ansicht der Ansichten drawRect Funktion. Ich würde es vorziehen, das vollständige 32-Bit-Rendering (einschließlich Alpha-Kanal) durchzuführen, würde aber auch mit 24-Bit-Rendering zufrieden sein.

Würde es jemand etwas ausmachen, mich mit einigen Code -Snippets oder relevanten APIs in die richtige Richtung zu zeigen?

Außerdem weiß ich genau, wie man das mit OpenGL macht - ich würde es einfach vorziehen, diese Arbeit in Kerngrafiken selbst zu erledigen.

War es hilfreich?

Lösung

Um in einen Offscreen -Kontext zu rendern und ihn als cgimageRef zu speichern:

void *bitmapData = calloc(height, bytesPerLine);
CGContextRef offscreen = CGBitmapContextCreate(..., bitmapData, ...)
// draw stuff into offscreen
CGImageRef image = CGBitmapContextCreateImage(offscreen);
CFRelease(offscreen);
free(bitmapData);

Um es auf den Bildschirm zu zeichnen:

- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextDrawImage(context, rect, image);
}

Sie können auch das Bild in der Inhaltseigenschaft der Ansicht der Layer -Inhaltseigenschaft speichern (view.layer.contents = image) oder verwenden Sie eine UIImageView.

Andere Tipps

Sie können a verwenden CgbitmapContext. Sie können ein Bild aus einem cgbitmapcontext erstellen und es während Ihres Drawrect zeichnen.

Verwenden CGDataProviderCreateWithData und CGImageCreate Wenn Sie den Bitmap -Kontext nicht benötigen und nur das wollen CGImageRef.

Als zukünftige Referenz finden Sie hier ein vollständiges Beispiel in Swift 2.1, um eine Bitmap außerhalb des Bildschirms zu rendern und auf dem Bildschirm anzuzeigen.

Beachten Sie, dass Sie, sobald Sie den Bitmap -Kontext erstellt haben, weiterhin mehr Inhalte in ihn zeichnen und die Ansicht aktualisieren können, wenn Sie möchten. Dies ist großartig, wenn Sie einen langwierigen Zeichnungsvorgang in einem Hintergrund -Thread durchführen und dem Benutzer regelmäßig Fortschritte zeigen möchten.

Ansicht Controller:

import UIKit

class ViewController: UIViewController {
    @IBOutlet var myView: MyView!
    var bitmapContext: CGContext?

    override func viewDidLoad() {
        super.viewDidLoad()
        createBitmapContext()
        drawContentIntoBitmap()
        myView.update(from: bitmapContext)
        releaseBitmapContext()
    }

    func createBitmapContext() {
        bitmapContext = CGBitmapContextCreate(
            nil,                                                        // auto-assign memory for the bitmap
            Int (myView.bounds.width * UIScreen.mainScreen().scale),    // width of the view in pixels
            Int (myView.bounds.height * UIScreen.mainScreen().scale),   // height of the view in pixels
            8,                                                          // 8 bits per colour component
            0,                                                          // auto-calculate bytes per row
            CGColorSpaceCreateDeviceRGB(),                              // create a suitable colour space
            CGImageAlphaInfo.PremultipliedFirst.rawValue)               // use quartz-friendly byte ordering
    }

    func drawContentIntoBitmap() {
        CGContextScaleCTM(bitmapContext, UIScreen.mainScreen().scale, UIScreen.mainScreen().scale)  // convert to points dimensions
        CGContextSetStrokeColorWithColor (bitmapContext, UIColor.redColor().CGColor)
        CGContextSetLineWidth (bitmapContext, 5.0)
        CGContextStrokeEllipseInRect (bitmapContext, CGRectMake(50, 50, 100, 100))
    }

    func releaseBitmapContext() {
        bitmapContext = nil // in Swift, CGContext and CGColorSpace objects are memory managed by automatic reference counting
    }
}

Unterklasse von UIView:

import UIKit

class MyView: UIView {     
    var cgImage: CGImage?

    func update(from bitmapContext: CGContext?) {
        cgImage = CGBitmapContextCreateImage(bitmapContext)
        setNeedsDisplay()
    }

    override func drawRect(rect: CGRect) {
        let displayContext = UIGraphicsGetCurrentContext()
        CGContextDrawImage(displayContext, bounds, cgImage)
    }

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top