Несколько наблюдений:
Ваш код предполагает, что UIGraphicsImageRenderer
генерирует изображения со шкалой 1, тогда как по умолчанию он равен 0 (т.е. независимо от масштаба, который использует ваше устройство).
Вместо этого установите шкалу в 1:
let format = UIGraphicsImageRendererFormat()
format.scale = 1
let renderer = UIGraphicsImageRenderer(size: CGSize(width: 200, height: 200), format: format)
Здесь не проблема, но мы должны отметить, что ваш код предполагает, что формат [113 ] будет определенный порядок и формат байтов, как и ваш imageFromARGB32Bitmap
. Если вы посмотрите на Техническую ноту Apple 1509 (из которой ваш код, несомненно, был изначально адаптирован), они не просто предполагают, что буфер будет в определенном формате. Когда мы хотим манипулировать / исследовать буфер, мы должны (а) создать контекст желаемого формата, (б) нарисовать наше изображение (или что-то еще) в этом контексте, и только тогда мы сможем надежно посмотреть на данные поставщика. [ 1127]
imageFromARGB32Bitmap
работает, но я немного нервничаю.
Использование MemoryLayout
: Apple рекомендует :
При выделении памяти для нескольких экземпляров T с использованием небезопасного указателя, используйте кратное
blockquote>stride
типа вместо егоsize
.Итак, я бы использовал
stride
.
Что, если stride
не было 4, как вы ожидаете? Я не могу себе представить, что когда-либо не будет 4, но с поставщиком данных предполагает, что они будут упакованы. Это небольшое наблюдение, но я мог бы сделать это предположение явным.
Мы уверены на 100%, что разыменование &data
даст нам непрерывный буфер? Я бы склонился к withContiguousStorageIfAvailable
просто чтобы быть в безопасности.
& nbsp;
Например:
func imageFromARGB32Bitmap(pixels: [PixelData], width: Int, height: Int) -> UIImage? {
guard width > 0,
height > 0,
pixels.count == width * height else { return nil }
let rgbColorSpace = CGColorSpaceCreateDeviceRGB()
let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedFirst.rawValue)
let bitsPerComponent = 8
let bitsPerPixel = 32
let stride = MemoryLayout.stride
assert(stride == 4)
return pixels.withContiguousStorageIfAvailable { bufferPointer -> UIImage? in
let data = Data(buffer: bufferPointer)
return CGDataProvider(data: data as CFData)
.flatMap { CGImage(width: width,
height: height,
bitsPerComponent: bitsPerComponent,
bitsPerPixel: bitsPerPixel,
bytesPerRow: width * stride,
space: rgbColorSpace,
bitmapInfo: bitmapInfo,
provider: [111],
decode: nil,
shouldInterpolate: true,
intent: .defaultIntent) }
.flatMap { UIImage(cgImage: [111]) }
} ?? nil
}
[1119 ] См. getTooltipText на JTree. Это должно позволить Вам показывать подсказки в зависимости от того, что в дереве колеблется. (Действительно прочитайте документы, хотя, необходимо зарегистрировать JTree в ToolTipManager.)
Да, вы можете использовать onMouseMoved
, а затем использовать метод (название не помню), который сообщает вам, на каком узле вы закончили. Если вы получите ноль, очевидно, что вы не находитесь над узлом.