我有一个SwiftUI图像显示如下:
Image("Map")
.resizable()
.gesture(
DragGesture(minimumDistance: 0, coordinateSpace: .global)
.onChanged { value in
self.position = value.location
print(position)
let color = getColor(at: position)
print(color)
}
.onEnded { _ in
self.position = .zero
}
)
字符串
getColor函数:
func getColor(at point: CGPoint) -> UIColor{
let pixel = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: 4)
let colorSpace = CGColorSpaceCreateDeviceRGB()
let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue)
let context = CGContext(data: pixel, width: 1, height: 1, bitsPerComponent: 8, bytesPerRow: 4, space: colorSpace, bitmapInfo: bitmapInfo.rawValue)!
context.translateBy(x: -point.x, y: -point.y)
let color = UIColor(red: CGFloat(pixel[0]) / 255.0,
green: CGFloat(pixel[1]) / 255.0,
blue: CGFloat(pixel[2]) / 255.0,
alpha: CGFloat(pixel[3]) / 255.0)
pixel.deallocate()
return color
}
型
当我启动应用程序并触摸图像时,位置在控制台上显示良好,但颜色返回0 0 0,例如:
(262.3333282470703, 691.6666564941406)
UIExtendedSRGBColorSpace 0 0 0 0
型
经过长时间的搜索,我没有找到一种方法来从SwiftUI中的图像中获取像素颜色,如果有人有解决方案或可以帮助我,那将是非常好的。
先谢谢你了。
1条答案
按热度按时间w8f9ii691#
这可能是一个比必要的更复杂的解决方案,但它有效。
基本上,它使用
ImageRenderer
创建Image
的基于内存的副本,而可见Image
的实际尺寸由GeometryReader
捕获。大小的差异用于缩放拖动位置。然后可以查询基于内存的视图的
cgImage
属性,以及在缩放的拖动坐标处挑选出的CGImage
像素。下面是代码-它显示一个图像(我把它裁剪成一个圆圈,因为它是一个色轮,但这不是必要的),覆盖一个光标,显示光标坐标和光标下的
Color
:字符串
x1c 0d1x的数据