2015-04-01 222 views
0

我希望能够将屏幕上的所有像素设置为特定颜色。我正在使用的方法是创建一个原始数据数组中的所有像素,然后创建一个UIImage,我把它放在UIImageView中。我裁剪的代码到这里面依然呈现出这个问题,我觉得我已经做了一些愚蠢的创建图像,但我看了所有的文件和恕我直言,一切似乎很动听:将原始ARGB像素数据转换为UIImage

结构保存PixelData取出

public struct PixelData { 
    var a: UInt8 = 255 
    var r: UInt8 
    var g: UInt8 
    var b: UInt8 
} 

充填阵列左半红色,右半黑色

func halfRood()->[PixelData] { 
     var data: [PixelData] = [] 

     for(var i = 0; i < Int(Constants.Resolution.x); i++) { 
      for(var j = 0; j < Int(Constants.Resolution.y); j++) { 
       if(j < Int(Constants.Resolution.y/2)) { 
        data.append(PixelData(a: 255, r: 255, g: 0, b: 0)) 
       } else { 
        data.append(PixelData(a: 255, r: 0, g: 0, b: 0)) 
       } 

      } 
     } 

     return data 
    } 

返回图像从位图

func imageFromARGB32Bitmap(pixels: [PixelData], width: UInt, height: UInt) -> UIImage? { 
    let bitsPerComponent: UInt = 8 
    let bitsPerPixel: UInt = 32 
    let rgbColorSpace = CGColorSpaceCreateDeviceRGB() 
    let bitmapInfo:CGBitmapInfo = CGBitmapInfo(CGImageAlphaInfo.PremultipliedFirst.rawValue) 

    var data = pixels 
    let providerRef = CGDataProviderCreateWithCFData(NSData(bytes: &data, length: data.count * sizeof(PixelData))) 
    let providerRefthing: CGDataProvider = providerRef 
    let cgImage = CGImageCreate(width, height, bitsPerComponent, bitsPerPixel, width * UInt(sizeof(PixelData)), rgbColorSpace, bitmapInfo, providerRef, nil, true, kCGRenderingIntentDefault) 
    let cgiimagething: CGImage = cgImage 
    return UIImage(CGImage: cgImage) 
} 

最后设置updateUI()函数

func updateUI() { 
     let data = halfRood() 
     if let image = imageFromARGB32Bitmap(data, width: UInt(Constants.Resolution.x), height: UInt(Constants.Resolution.y)) { 
      imageView?.image = image 
     } 
    } 

输出类似于下面的图片,而我希望是这样的: [红色半|黑色半]

currentSituation

回答

2

CoreGraphics在期望的像素数据为行,不列。只需翻转你的这样的陈述:

func halfRood()->[PixelData] { 
    var data: [PixelData] = [] 
    for(var y = 0; y < Int(Constants.Resolution.y); y++) { 
     for(var x = 0; x < Int(Constants.Resolution.x); x++) { 
      if(y < Int(Constants.Resolution.y/2)) { 
       data.append(PixelData(a: 255, r: 255, g: 0, b: 0)) 
      } else { 
       data.append(PixelData(a: 255, r: 0, g: 0, b: 0)) 
      } 
     } 
    } 

    return data 
} 
+0

这是解决方案,非常感谢! – Simon 2015-04-01 12:29:56