Проблема с типами значений и инициалами - PullRequest
1 голос
/ 20 октября 2019

Я следую старому учебнику по настройке структуры данных для просмотра значений 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 разрешает передачу данных типа UInt32 через RGBAPixel. Опять же, очень новый, так что поправьте меня , где Я ошибаюсь. Спасибо

1 Ответ

0 голосов
/ 20 октября 2019

Вы используете <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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...