Я получил изображение с большим изображением наПочему метод CGImageGetBytesPerRow() возвращает странное значение для некоторых изображений?
let partialCGImage = CGImageCreateWithImageInRect(CGImage, frame)
но иногда я получил неправильное значение RGBA. Например, я вычислил средние красные значения изображения, но получилось как серое изображение. Итак, я проверил информацию, как следует.
image width: 64
image height: 64
image has 5120 bytes per row
image has 8 bits per component
image color space: <CGColorSpace 0x15d68fbd0> (kCGColorSpaceICCBased; kCGColorSpaceModelRGB; sRGB IEC61966-2.1)
image is mask: false
image bitmap info: CGBitmapInfo(rawValue: 8194)
image has 32 bits per pixel
image utt type: nil
image should interpolate: true
image rendering intent: CGColorRenderingIntent
Bitamp Info: ------
Alpha info mask: Ture
Float components: False
Byte oder mask: Ture
Byte order default: False
Byte order 16 little: False
Byte order 32 little: Ture
Byte order 16 big: Ture
Byte order 32 big: False
Image Info ended---------------
Тогда я получил очень странные проблемы, поэтому ширина и высота оба 64 PXS, и изображение имеет 8 бит (1 байт) в расчете на компонент (4 байта на пиксель), но байт в строке 5120?
И я замечаю, что битмап-информация нормального изображения совсем иная, у него нет информации о байтовом порядке. Я искал разные слова между маленьким эндисом и большим эндиантом, но я смутился, когда они появились вместе. Мне действительно нужна помощь, так как из-за этого мой проект уже задерживается на 2 дня. Благодаря!
Кстати, я использовал следующий код, чтобы получить значение RGBA.
let pixelData=CGDataProviderCopyData(CGImageGetDataProvider(self.CGImage))
let data:UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)
var rs: [[Int]] = []
var gs: [[Int]] = []
var bs: [[Int]] = []
let widthMax = imageWidth
let heightMax = imageHeight
for indexX in 0...widthMax {
var tempR: [Int] = []
var tempG: [Int] = []
var tempB: [Int] = []
for indexY in 0...heightMax {
let offSet = 4 * (indexX * imageWidth + indexY)
**let r = Int(data[pixelInfo + offSet])
let g = Int(data[pixelInfo + 1 + offSet])
let b = Int(data[pixelInfo + 2 + offSet])**
tempR.append(r)
tempG.append(g)
tempB.append(b)
}
rs.append(tempR)
gs.append(tempG)
bs.append(tempB)
}
Спросите меня, есть ли у вас проблемы с моим кодом. Спасибо за помощь.
Спасибо вам большое! Я попробовал метод, который вы упомянули, и это сработало! – JsW
Но у него все еще есть одна проблема: я создаю изображение 2448 * 2222 jpeg и устанавливаю все RGB-цвета пикселей в (238, 42, 43) без альфа-канала в Photoshop. Но в моем приложении получается (231, 17, 33). Кроме того, я использую следующий алгоритм для вычисления среднего значения RGB. 'FUNC averageOfdata (Массив данных: [[Int]]) -> Int { вар resultInTotal: Int Count = 0 вар: Int = 0 для valueArray в данных { для значения в valueArray { счетчик + = 1 resultInTotal + = значение } } возвращение Int (resultInTotal/count) } ' – JsW
Спросите меня, если у вас есть вопрос, спасибо за вашу помощь! – JsW