ios - 值类型和初始化的问题
问题描述
我正在关注关于设置数据结构以查看图像中的 RGBA 值的旧教程。在大多数情况下,我已经解决了所有数据不足的问题,但我遇到了一个看起来超级简单的问题,我对 swift 还比较陌生,所以事实证明它有点困难。
import UIKit
public struct RGBAPixel {
public init(rawVal : UInt32) {
raw = rawVal
}
public var raw: UInt32
public var red: UInt8 {
get { return UInt8(raw & 0xFF) }
set { raw = UInt32(newValue) | (raw & 0xFFFFFF00) }
}
public var green: UInt8 {
get { return UInt8( (raw & 0xFF00) >> 8) }
set { raw = (UInt32(newValue) << 8) | (raw & 0xFFFF00FF) }
}
public var blue: UInt8 {
get { return UInt8( (raw & 0xFF0000) >> 16) }
set { raw = (UInt32(newValue) << 16) | (raw & 0xFF00FFFF) }
}
public var alpha: UInt8 {
get { return UInt8( (raw & 0xFF000000) >> 24) }
set { raw = (UInt32(newValue) << 24) | (raw & 0x00FFFFFF) }
}
}
let image = UIImage(named: "crossSection.jpg")
let height = Int((image?.size.height)!)
let width = Int((image?.size.width)!)
let bitsPerComponent = Int(8)
let bytesPerRow = 4 * width
let colorSpace = CGColorSpaceCreateDeviceRGB()
let rawData = UnsafeMutablePointer<UInt32>.allocate(capacity: width * height)
let bitmapInfo: UInt32 = CGBitmapInfo.byteOrder32Big.rawValue | CGImageAlphaInfo.premultipliedLast.rawValue
let CGPointZero = CGPoint(x: 0,y: 0)
let rect = CGRect(origin: CGPointZero, size: (image?.size)!)
let imageContext = CGContext(data: rawData, width: width, height: height, bitsPerComponent: bitsPerComponent, bytesPerRow: bytesPerRow, space: colorSpace, bitmapInfo: bitmapInfo)
imageContext?.draw(image!.cgImage!, in:rect)
let pixels = UnsafeMutableBufferPointer<UInt32>(start: rawData, count: width * height)
///*
for var y in 0 ..< height {
for var x in 0 ..< width {
var p = pixels[x+y*width] = RGBAPixel(rawVal: 0)
p.red = 255
pixels[x+y*width] = p
}
}
//*/
let outContext = CGContext(data: pixels.baseAddress, width: width, height: height, bitsPerComponent: bitsPerComponent, bytesPerRow: bytesPerRow, space: colorSpace, bitmapInfo: bitmapInfo)
let outImage = UIImage(cgImage: outContext!.makeImage()!)
有两个问题点。首先是靠近底部的问题,当放入 swift 时,它会给出错误“无法将 'RGBAPixel' 类型的值分配给 'UInt32' 类型”。我很好地遵循了视频,并查找了我似乎找不到的任何错误。似乎这个问题不是来自更新的问题,所以我很困惑。我研究了结构和初始化,代码的编写方式似乎很有意义。init 允许通过 RGBAPixel 传入数据类型 UInt32。再次,非常新,所以请纠正我的错误。谢谢
解决方案
您正在使用<UInt32>
而不是<RGBAPixel>
let rawData = UnsafeMutablePointer<UInt32>.allocate(capacity: width * height)
//Should be:
let rawData = UnsafeMutablePointer<RGBAPixel>.allocate(capacity: width * height)
与:
let pixels = UnsafeMutableBufferPointer<UInt32>(start: rawData, count: width * height)
// Should be:
let pixels = UnsafeMutableBufferPointer<RGBAPixel>(start: rawData, count: width * height)
试试这个(为了便于阅读,我添加了一些空行) - 使用黑色作为颜色:
import UIKit
struct RGBAPixel {
var raw: UInt32
public init(rawVal : UInt32) {
raw = rawVal
}
public var red: UInt8 {
get { return UInt8(raw & 0xFF) }
set { raw = UInt32(newValue) | (raw & 0xFFFFFF00) }
}
public var green: UInt8 {
get { return UInt8( (raw & 0xFF00) >> 8) }
set { raw = (UInt32(newValue) << 8) | (raw & 0xFFFF00FF) }
}
public var blue: UInt8 {
get { return UInt8( (raw & 0xFF0000) >> 16) }
set { raw = (UInt32(newValue) << 16) | (raw & 0xFF00FFFF) }
}
public var alpha: UInt8 {
get { return UInt8( (raw & 0xFF000000) >> 24) }
set { raw = (UInt32(newValue) << 24) | (raw & 0x00FFFFFF) }
}
}
let image = UIImage(named: "crossSection.jpg")
let height = Int((image?.size.height)!)
let width = Int((image?.size.width)!)
let bitsPerComponent = Int(8)
let bytesPerRow = 4 * width
let colorSpace = CGColorSpaceCreateDeviceRGB()
let rawData = UnsafeMutablePointer<RGBAPixel>.allocate(capacity: width * height)
let bitmapInfo: UInt32 = CGBitmapInfo.byteOrder32Big.rawValue | CGImageAlphaInfo.premultipliedLast.rawValue
let CGPointZero = CGPoint(x: 0,y: 0)
let rect = CGRect(origin: CGPointZero, size: (image?.size)!)
let imageContext = CGContext(data: rawData, width: width, height: height, bitsPerComponent: bitsPerComponent, bytesPerRow: bytesPerRow, space: colorSpace, bitmapInfo: bitmapInfo)
imageContext?.draw(image!.cgImage!, in:rect)
let pixels = UnsafeMutableBufferPointer<RGBAPixel>(start: rawData, count: width * height)
///*
for var y in 0 ..< height {
for var x in 0 ..< width {
pixels[x+y*width] = RGBAPixel(rawVal: 0xFF000000)
}
}
//*/
let outContext = CGContext(data: pixels.baseAddress, width: width, height: height, bitsPerComponent: bitsPerComponent, bytesPerRow: bytesPerRow, space: colorSpace, bitmapInfo: bitmapInfo)
let outImage = UIImage(cgImage: outContext!.makeImage()!)
要使用颜色:
for var y in 0 ..< height {
for var x in 0 ..< width {
var p = RGBAPixel(rawVal: 0xFF000000)
p.red = 128
pixels[x+y*width] = p
}
}
推荐阅读
- swift - Swift多协议一致性,编译错误
- pandas - pandas groupby + 多个聚合/应用多个列
- azure - Azure API 管理服务中的“JWT 验证失败:JWT 不存在..”
- python - 如何通过创建新数组并保持旧数组不变来更新数组
- prometheus - 如何在使用通配符时获取 prometheus/grafana 中单个指标的速率?
- java - springboot,如何有效@RequestBody
- scala - 执行 UDF 失败
- matlab - MATLAB,如何解决Index超过数组元素个数(1)?
- git - 为什么 VS Code 终端总是询问我的 SSH 密码?
- android - firebase 测试实验室生成的 coverage.ec 文件仅显示 Java 文件的覆盖率,它不显示 Kotlin 文件