|
@@ -586,9 +586,6 @@ extension ScannerService: ICDeviceDelegate, ICScannerDeviceDelegate {
|
|
|
nonisolated func scannerDevice(_ scanner: ICScannerDevice, didScanTo url: URL) {
|
|
nonisolated func scannerDevice(_ scanner: ICScannerDevice, didScanTo url: URL) {
|
|
|
Task { @MainActor in
|
|
Task { @MainActor in
|
|
|
scannedImageURL = url
|
|
scannedImageURL = url
|
|
|
- if let image = imageFromScanURL(url) {
|
|
|
|
|
- finishScan(with: .success(image))
|
|
|
|
|
- }
|
|
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -649,14 +646,31 @@ private extension ScanResolution {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private extension ScannerService {
|
|
private extension ScannerService {
|
|
|
|
|
+ struct BandImageFormat {
|
|
|
|
|
+ let colorSpace: CGColorSpace
|
|
|
|
|
+ let bitmapInfo: CGBitmapInfo
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ func bandImageFormat(for bandData: ICScannerBandData) -> BandImageFormat {
|
|
|
|
|
+ if Int(bandData.bitsPerPixel) <= 8 {
|
|
|
|
|
+ return BandImageFormat(
|
|
|
|
|
+ colorSpace: CGColorSpaceCreateDeviceGray(),
|
|
|
|
|
+ bitmapInfo: CGBitmapInfo(rawValue: CGImageAlphaInfo.none.rawValue)
|
|
|
|
|
+ )
|
|
|
|
|
+ }
|
|
|
|
|
+ return BandImageFormat(
|
|
|
|
|
+ colorSpace: CGColorSpaceCreateDeviceRGB(),
|
|
|
|
|
+ bitmapInfo: CGBitmapInfo(rawValue: CGImageAlphaInfo.noneSkipLast.rawValue)
|
|
|
|
|
+ )
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
func imageFromBandData(_ bandData: ICScannerBandData) -> NSImage? {
|
|
func imageFromBandData(_ bandData: ICScannerBandData) -> NSImage? {
|
|
|
guard let data = bandData.dataBuffer,
|
|
guard let data = bandData.dataBuffer,
|
|
|
!data.isEmpty,
|
|
!data.isEmpty,
|
|
|
bandData.fullImageWidth > 0,
|
|
bandData.fullImageWidth > 0,
|
|
|
bandData.dataNumRows > 0 else { return nil }
|
|
bandData.dataNumRows > 0 else { return nil }
|
|
|
|
|
|
|
|
- let colorSpace = CGColorSpaceCreateDeviceRGB()
|
|
|
|
|
- let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.noneSkipLast.rawValue)
|
|
|
|
|
|
|
+ let format = bandImageFormat(for: bandData)
|
|
|
guard let provider = CGDataProvider(data: data as CFData),
|
|
guard let provider = CGDataProvider(data: data as CFData),
|
|
|
let cgImage = CGImage(
|
|
let cgImage = CGImage(
|
|
|
width: Int(bandData.fullImageWidth),
|
|
width: Int(bandData.fullImageWidth),
|
|
@@ -664,8 +678,8 @@ private extension ScannerService {
|
|
|
bitsPerComponent: Int(bandData.bitsPerComponent),
|
|
bitsPerComponent: Int(bandData.bitsPerComponent),
|
|
|
bitsPerPixel: Int(bandData.bitsPerPixel),
|
|
bitsPerPixel: Int(bandData.bitsPerPixel),
|
|
|
bytesPerRow: Int(bandData.bytesPerRow),
|
|
bytesPerRow: Int(bandData.bytesPerRow),
|
|
|
- space: colorSpace,
|
|
|
|
|
- bitmapInfo: bitmapInfo,
|
|
|
|
|
|
|
+ space: format.colorSpace,
|
|
|
|
|
+ bitmapInfo: format.bitmapInfo,
|
|
|
provider: provider,
|
|
provider: provider,
|
|
|
decode: nil,
|
|
decode: nil,
|
|
|
shouldInterpolate: true,
|
|
shouldInterpolate: true,
|
|
@@ -700,8 +714,7 @@ private extension ScannerService {
|
|
|
fullData.replaceSubrange(startOffset..<(startOffset + copyLength), with: bandData.prefix(copyLength))
|
|
fullData.replaceSubrange(startOffset..<(startOffset + copyLength), with: bandData.prefix(copyLength))
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- let colorSpace = CGColorSpaceCreateDeviceRGB()
|
|
|
|
|
- let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.noneSkipLast.rawValue)
|
|
|
|
|
|
|
+ let format = bandImageFormat(for: first)
|
|
|
var mutableData = fullData
|
|
var mutableData = fullData
|
|
|
return mutableData.withUnsafeMutableBytes { buffer in
|
|
return mutableData.withUnsafeMutableBytes { buffer in
|
|
|
guard let baseAddress = buffer.baseAddress,
|
|
guard let baseAddress = buffer.baseAddress,
|
|
@@ -711,8 +724,8 @@ private extension ScannerService {
|
|
|
height: height,
|
|
height: height,
|
|
|
bitsPerComponent: Int(first.bitsPerComponent),
|
|
bitsPerComponent: Int(first.bitsPerComponent),
|
|
|
bytesPerRow: bytesPerRow,
|
|
bytesPerRow: bytesPerRow,
|
|
|
- space: colorSpace,
|
|
|
|
|
- bitmapInfo: bitmapInfo.rawValue
|
|
|
|
|
|
|
+ space: format.colorSpace,
|
|
|
|
|
+ bitmapInfo: format.bitmapInfo.rawValue
|
|
|
),
|
|
),
|
|
|
let cgImage = context.makeImage() else {
|
|
let cgImage = context.makeImage() else {
|
|
|
return nil
|
|
return nil
|