【问题标题】:Turning raw ARGB pixeldata into UIImage将原始 ARGB 像素数据转换为 UIImage
【发布时间】:2015-04-01 00:11:19
【问题描述】:

我希望能够将屏幕上的所有像素设置为特定颜色。我正在使用的方法是在原始数据数组中创建所有像素,然后创建一个 UIImage,并将其放入 UIImageView 中。我将代码裁剪为仍然显示问题的代码,我想我通过创建图像做了一些愚蠢的事情,但我已经阅读了所有文档,恕我直言一切似乎都很好:

保存像素数据的结构

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
        }
    }

输出如下图所示,而我期望的是: 【红一半|黑半]

【问题讨论】:

    标签: swift uiimage core-graphics cgimage argb


    【解决方案1】:

    CoreGraphics 要求像素数据为行,而不是列。只需像这样翻转你的 for 语句:

    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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-21
      • 1970-01-01
      • 2021-02-03
      • 1970-01-01
      • 2013-10-26
      • 1970-01-01
      相关资源
      最近更新 更多