summaryrefslogtreecommitdiff
path: root/Radio/Utils/WaterfallFile/SimpleImage.swift
diff options
context:
space:
mode:
Diffstat (limited to 'Radio/Utils/WaterfallFile/SimpleImage.swift')
-rw-r--r--Radio/Utils/WaterfallFile/SimpleImage.swift116
1 files changed, 116 insertions, 0 deletions
diff --git a/Radio/Utils/WaterfallFile/SimpleImage.swift b/Radio/Utils/WaterfallFile/SimpleImage.swift
new file mode 100644
index 0000000..c05709f
--- /dev/null
+++ b/Radio/Utils/WaterfallFile/SimpleImage.swift
@@ -0,0 +1,116 @@
+//
+// Image.swift
+// PrySDR
+//
+// Created by Jacky Jack on 27/12/2024.
+//
+
+import Foundation
+import AppKit
+
+// https://stackoverflow.com/questions/30958427/pixel-array-to-uiimage-in-swift
+public struct PixelData {
+ var a: UInt8
+ var r: UInt8
+ var g: UInt8
+ var b: UInt8
+}
+
+public class SimpleImage {
+
+ private var pixels: [PixelData] = []
+ private var width:Int = 0
+ private var height:Int = 0
+
+ init(width: Int, height: Int) {
+ self.width = width
+ self.height = height
+ pixels = .init(repeating: .init(a: 255, r: 0, g: 0, b: 0), count: width*height)
+ }
+
+
+ func drawPalletLine(line: Int, pixelLine:[Float]) {
+ for i in 0..<self.width {
+ var pixel = pixelLine[i]
+ if pixel>256.0 {
+ //print("values to high")
+ pixel = 255.0
+ }
+ if pixel < 0.0 {
+ pixel = 0.0
+ }
+ self.pixels[line*self.width + i].a = 255
+ self.pixels[line*self.width + i].r = UInt8(pixel)
+ self.pixels[line*self.width + i].g = UInt8(pixel)
+ self.pixels[line*self.width + i].b = UInt8(pixel)
+ }
+ }
+
+ func drawPixel(_ w: Int, _ h: Int, _ pixel: PixelData) {
+ self.pixels[h*self.height+w] = pixel
+ }
+
+ func toCGImage() -> CGImage? {
+ guard self.width > 0 && self.height > 0 else { return nil }
+ guard self.pixels.count == self.width * self.height else { return nil }
+
+ let rgbColorSpace = CGColorSpaceCreateDeviceRGB()
+ let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedFirst.rawValue)
+ let bitsPerComponent = 8
+ let bitsPerPixel = 32
+
+ var data = self.pixels // Copy to mutable []
+ guard let providerRef = CGDataProvider(data: NSData(bytes: &data,
+ length: data.count * MemoryLayout<PixelData>.size)
+ )
+ else { return nil }
+
+ guard let cgim = CGImage(
+ width: self.width,
+ height: self.height,
+ bitsPerComponent: bitsPerComponent,
+ bitsPerPixel: bitsPerPixel,
+ bytesPerRow: self.width * MemoryLayout<PixelData>.size,
+ space: rgbColorSpace,
+ bitmapInfo: bitmapInfo,
+ provider: providerRef,
+ decode: nil,
+ shouldInterpolate: true,
+ intent: .defaultIntent
+ )
+ else { return nil }
+
+ return cgim
+ }
+
+ func toNSImage() -> NSImage? {
+ guard let cgim = toCGImage() else { return nil }
+ return NSImage(cgImage: cgim, size:.zero)
+ }
+
+ func saveAsJPEG(_ image: NSImage, _ name: String) {
+ if let imageData = image.tiffRepresentation {
+ do {
+ let bundlePath = Bundle.main.resourcePath!
+ let imageUrl = URL(fileURLWithPath:bundlePath+"/"+name)
+ try imageData.write(to: imageUrl)
+
+ } catch {
+ print("Cant save image to disk")
+ }
+
+ } else {
+ print("cant get tiff representation")
+ }
+ }
+
+ func saveAsJPEG(_ name: String) {
+ if let img = self.toNSImage() {
+ saveAsJPEG(img, name)
+ }
+ }
+}
+
+
+
+