- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
通常需要从图像中获取像素数据或从像素数据重建图像。我如何拍摄图像,将其转换为像素值数组,然后使用 Swift
中的像素数组使用 CoreGraphics
重建它?
这个问题的答案质量到处都是,所以我想要一个规范的答案。
最佳答案
这个函数可以很容易地扩展到彩色图像。为简单起见,我使用的是灰度,但我已经评论了更改以获得 RGB。
func pixelValuesFromImage(imageRef: CGImage?) -> (pixelValues: [UInt8]?, width: Int, height: Int)
{
var width = 0
var height = 0
var pixelValues: [UInt8]?
if let imageRef = imageRef {
let totalBytes = imageRef.width * imageRef.height
let colorSpace = CGColorSpaceCreateDeviceGray()
pixelValues = [UInt8](repeating: 0, count: totalBytes)
pixelValues?.withUnsafeMutableBytes({
width = imageRef.width
height = imageRef.height
let contextRef = CGContext(data: $0.baseAddress, width: width, height: height, bitsPerComponent: 8, bytesPerRow: width, space: colorSpace, bitmapInfo: 0)
let drawRect = CGRect(x: 0.0, y:0.0, width: CGFloat(width), height: CGFloat(height))
contextRef?.draw(imageRef, in: drawRect)
})
}
return (pixelValues, width, height)
}
我重建图像,在本例中为每像素 8 位灰度,返回到 CGImage
。
func imageFromPixelValues(pixelValues: [UInt8]?, width: Int, height: Int) -> CGImage?
{
var imageRef: CGImage?
if let pixelValues = pixelValues {
let bitsPerComponent = 8
let bytesPerPixel = 1
let bitsPerPixel = bytesPerPixel * bitsPerComponent
let bytesPerRow = bytesPerPixel * width
let totalBytes = width * height
let unusedCallback: CGDataProviderReleaseDataCallback = { optionalPointer, pointer, valueInt in }
let providerRef = CGDataProvider(dataInfo: nil, data: pixelValues, size: totalBytes, releaseData: unusedCallback)
let bitmapInfo: CGBitmapInfo = [CGBitmapInfo(rawValue: CGImageAlphaInfo.none.rawValue), CGBitmapInfo(rawValue: CGImageByteOrderInfo.orderDefault.rawValue)]
imageRef = CGImage(width: width,
height: height,
bitsPerComponent: bitsPerComponent,
bitsPerPixel: bitsPerPixel,
bytesPerRow: bytesPerRow,
space: CGColorSpaceCreateDeviceGray(),
bitmapInfo: bitmapInfo,
provider: providerRef!,
decode: nil,
shouldInterpolate: false,
intent: .defaultIntent)
}
return imageRef
}
您需要将图像复制到 Playground 的 Resources 文件夹中,然后更改下面的文件名和扩展名以匹配。最后一行的结果是从 CGImage 构造的 UIImage。
import Foundation
import CoreGraphics
import UIKit
import PlaygroundSupport
let URL = playgroundSharedDataDirectory.appendingPathComponent("zebra.jpg")
print("URL \(URL)")
var image: UIImage? = nil
if FileManager().fileExists(atPath: URL.path) {
do {
try NSData(contentsOf: URL, options: .mappedIfSafe)
} catch let error as NSError {
print ("Error: \(error.localizedDescription)")
}
image = UIImage(contentsOfFile: URL.path)
} else {
print("File not found")
}
let (intensityValues, width, height) = pixelValuesFromImage(imageRef: image?.cgImage)
let roundTrippedImage = imageFromPixelValues(pixelValues: intensityValues, width: width, height: height)
let zebra = UIImage(cgImage: roundTrippedImage!)
关于swift - 如何从强度值重建灰度图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34677133/
我正在开发一个录音机应用程序。我想知道在录制音频时有什么方法可以找到音频的强度。我不想将录音保存在任何地方。我只想向用户展示麦克风捕捉到的声音是否大于预定义的阈值。 假设如果声音低于 2 分贝,它应该
我正在尝试让一个基本服务器(从 Beginning Python 复制)来发送一个 str。 错误: c.send( "XXX" ) TypeError: must be bytes or buffe
我陷入了一个问题,不知道去哪里看。我需要增加图像中特定颜色的强度,例如 R、G 或蓝色。当我这样做时,某些颜色无法正确呈现。 下面是我为测试拍摄的图像: 现在当我像绿色一样增加时: A = Color
我不希望我的背景图片太模糊。没有调整模糊强度的属性吗? let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.Light) blurEffect
我使用 OpenCV 2.4.11+Qt 并尝试制作视频并更改红色/蓝色或绿色 channel 的强度,但没有找到任何功能或设置来执行此操作。有谁知道如何做到这一点? 最佳答案 如果您只想更改一个特定
当我有 x、y、强度时,我不知道如何创建热图(或等高线图)。我有一个看起来像这样的文件: 0,1,6 0,2,10 .... 到目前为止: with open('eye_.txt', 'r') as
有谁有一些可以在 iPhone 应用程序中使用的代码,让我可以看到 wifi 的强度吗?我有一个连接密集型操作,并且希望它们不在不稳定区域 最佳答案 这可能会帮助您走上正确的道路...... http
当从 RGB 转换为灰度时,据说应该对 R、G 和 B channel 应用特定的权重。这些权重是:0.2989、0.5870、0.1140。 据说这是因为人类对这三种颜色的感知/感受不同。有时也有人
Eclipse SSH key 生成屏幕(常规 -> 网络连接 -> SSH2)生成 1024 位 RSA key ,该 key 太弱而无法使用 ( http://news.netcraft.com/
当从 RGB 转换为灰度时,据说应该对 R、G 和 B channel 应用特定的权重。这些权重是:0.2989、0.5870、0.1140。 据说这是因为人类对这三种颜色的感知/感受不同。有时也有人
我们的网络应用程序使用 the Vibrate API对于微妙的按钮按下效果: window.navigator.vibrate(5); 但在我的新手机上,感觉不那么微妙,更像是我的手机正试图从我手中
我的应用程序应扫描周围的 Wifi 信号并列出网络名称及其 RSSI。 我在谷歌上找不到任何关于如何做的线索。有人可以举个例子或者至少指出其他地方我可以找到答案吗? 最佳答案 我认为这不可能!不管是
所以我的图像有一些黑点,它们看起来很简单,所以我想我可以创建一个亮度图,将其反转,然后将其应用到我的图像以消除黑点。然而,我所能找到的只有两种均衡方法:均衡整个图像(使用直方图)或将图像分割成深色和浅
我是一名优秀的程序员,十分优秀!