CGBitmapContextCreate:不支持的参数组合如何传递kCGImageAlphaNoneSkipFirst [重复]

【字号: 日期:2024-04-13浏览:45作者:雯心
(adsbygoogle = window.adsbygoogle || []).push({}); 如何解决CGBitmapContextCreate:不支持的参数组合如何传递kCGImageAlphaNoneSkipFirst [重复]?

在Objective-C中,您只需将其转换为其他枚举类型,如下所示:

(CGBitmapInfo)kCGImageAlphaNoneskipFirst

在Swift中,您必须这样做:

CGBitmapInfo(CGImageAlphaInfo.NoneskipFirst.rawValue)

欢迎来到Swift数值的狂野古怪的世界。您必须使用rawValue;将数值从原始CGImageAlphaInfo枚举中拉出。现在,您可以在CGBitmapInfo枚举的初始化程序中使用该数值。

在iOS 9 / Swift 2.0中,这要简单得多,您可以CGImageAlphaInfo.NoneskipFirst.rawValue直接 将其传递到CGBitmapContextCreate中,该位置现在只需要一个整数即可。

解决方法

我最初是用Obj-C编写此应用程序(GitHub),但需要将其转换为Swift。转换后,我一直难以获取创建位图的上下文。

错误信息:

Whiteboard[2833] <Error>: CGBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 24 bits/pixel; 3-component color space; kCGImageAlphaNone; 1500 bytes/row.

本来我有这个:

self.cacheContext = CGBitmapContextCreate (self.cacheBitmap,size.width,size.height,8,bitmapBytesPerRow,CGColorSpaceCreateDeviceRGB(),kCGImageAlphaNoneSkipFirst);

现在我有:

self.cacheContext = CGBitmapContextCreate(self.cacheBitmap!,UInt(size.width),UInt(size.height),CGBitmapInfo.ByteOrder32Little);

我相信这个问题与有关CGBitmapInfo.ByteOrder32Little,但是我不确定该怎么做。有没有办法通过kCGImageAlphaNoneSkipFirst的CGBitmapInfo?

全文:

//// WhiteBoard.swift// Whiteboard//import Foundationimport UIKitclass WhiteBoard: UIView { var hue: CGFloat var cacheBitmap: UnsafeMutablePointer<Void>? var cacheContext: CGContextRef? override init(frame: CGRect) {self.hue = 0.0;// Create a UIView with the size of the parent viewsuper.init(frame: frame);// Initialize the Cache Context of the bitmapself.initContext(frame);// Set the background color of the view to be Whiteself.backgroundColor = UIColor.whiteColor();// Add a Save Button to the bottom right corner of the screenlet buttonFrame = CGRectMake(frame.size.width - 50,frame.size.height - 30,40,25);let button = UIButton();button.frame = buttonFrame;button.setTitle('Save',forState: .Normal);button.setTitleColor(UIColor.blueColor(),forState: .Normal);button.addTarget(self,action: 'downloadImage',forControlEvents: .TouchUpInside);// Add the button to the viewself.addSubview(button); } required init(coder aDecoder: NSCoder) {self.hue = 0.0;super.init(coder: aDecoder) } func initContext(frame: CGRect)-> Bool {let size = frame.size; // Get the size of the UIViewvar bitmapByteCount: UInt!var bitmapBytesPerRow: UInt!// Calculate the number of bytes per row. 4 bytes per pixel: red,green,blue,alphabitmapBytesPerRow = UInt(size.width * 4);// Total Bytes in the bitmapbitmapByteCount = UInt(CGFloat(bitmapBytesPerRow) * size.height);// Allocate memory for image data. This is the destination in memory where any// drawing to the bitmap context will be renderedself.cacheBitmap = malloc(bitmapByteCount);// Create the Cache Context from the Bitmapself.cacheContext = CGBitmapContextCreate(self.cacheBitmap!,CGBitmapInfo.ByteOrder32Little);// Set the background as whiteCGContextSetRGBFillColor(self.cacheContext,1.0,1.0);CGContextFillRect(self.cacheContext,frame);CGContextSaveGState(self.cacheContext);return true; } // Fired everytime a touch event is dragged override func touchesMoved(touches: NSSet,withEvent event: UIEvent) {let touch = touches.anyObject() as UITouch;self.drawToCache(touch); } // Draw the new touch event to the cached Bitmap func drawToCache(touch: UITouch) {self.hue += 0.005;if(self.hue > 1.0) { self.hue = 0.0;}// Create a color object of the line colorlet color = UIColor(hue: CGFloat(self.hue),saturation: CGFloat(0.7),brightness: CGFloat(1.0),alpha: CGFloat(1.0));// Set the line size,type,and colorCGContextSetStrokeColorWithColor(self.cacheContext,color.CGColor);CGContextSetLineCap(self.cacheContext,kCGLineCapRound);CGContextSetLineWidth(self.cacheContext,CGFloat(15));// Get the current and last touch pointlet lastPoint = touch.previousLocationInView(self) as CGPoint;let newPoint = touch.locationInView(self) as CGPoint;// Draw the lineCGContextMoveToPoint(self.cacheContext,lastPoint.x,lastPoint.y);CGContextAddLineToPoint(self.cacheContext,newPoint.x,newPoint.y);CGContextStrokePath(self.cacheContext);// Calculate the dirty pixels that needs to be updatedlet dirtyPoint1 = CGRectMake(lastPoint.x-10,lastPoint.y-10,20,20);let dirtyPoint2 = CGRectMake(newPoint.x-10,newPoint.y-10,20);self.setNeedsDisplay();// Only update the dirty pixels to improve performance//self.setNeedsDisplayInRect(dirtyPoint1);//self.setNeedsDisplayInRect(dirtyPoint2); } // Draw the cachedBitmap to the UIView override func drawRect(rect: CGRect) {// Get the current Graphics Contextlet context = UIGraphicsGetCurrentContext();// Get the Image to drawlet cacheImage = CGBitmapContextCreateImage(self.cacheContext);// Draw the ImageContext to the screenCGContextDrawImage(context,self.bounds,cacheImage); } // Download the image to the camera roll func downloadImage() {// Get the Image from the CGContextlet image = UIImage(CGImage: CGBitmapContextCreateImage(self.cacheContext));// Save the Image to their Camera RollUIImageWriteToSavedPhotosAlbum(image,self,'image:didFinishSavingWithError:contextInfo:',nil); } func image(image: UIImage,didFinishSavingWithError error: NSError,contextInfo: UnsafeMutablePointer<Void>) {if(!error.localizedDescription.isEmpty) { UIAlertView(title: 'Error',message: 'Error Saving Photo',delegate: nil,cancelButtonTitle: 'Ok').show();} }}

相关文章: