Librería ImageScout para detección rápida de imágenes en Swift

Estructura del proyecto ImageScout

ImageScout es una biblioteca escrita en Swift diseñada para identificar rápidamente el tipo y tamaño de imágenes remotas sin descargar todo su contenido. Soporta formatos PNG, GIF y JPEG. El proyecto sigue una estructura clara y modular que facilita su integración y mantenimiento.

ImageScout/
├── Sources/
│   └── ImageScout/
│       ├── ImageScout.swift
│       └── ImageParser.swift
├── Tests/
│   └── ImageScoutTests/
│       └── ImageDetectionTests.swift
├── ImageScout.xcodeproj
├── ImageScout.xcworkspace
├── LICENSE
├── README.md
├── ImageScout.podspec
├── Package.swift
├── .gitignore
└── ...
 
  • Sources/: Contiene el código fuente principal. El directorio ImageScout/ alberga los archivos clave como ImageScout.swift, que define la API pública, y ImageParser.swift, responsable del análisis binario de encabezados de imagen.
  • Tests/: Incluye pruebas unitarias. Los casos de prueba en ImageDetectionTests.swift validan el correcto reconocimiento de formatos y dimensiones.
  • ImageScout.xcodeproj y ImageScout.xcworkspace: Archivos necesarios para trabajar con Xcode.
  • LICENSE: Define la licencia MIT bajo la cual se distribuye el proyecto.
  • README.md: Documentación inicial con instruccinoes de uso y ejemplos.
  • ImageScout.podspec: Configuraicón para CocoaPods, especificando versión, dependencias y ubicación del código.
  • Package.swift: Archivo de configuración para Swift Package Manager, definido para Swift 5.3 o superior.
  • .gitignore: Excluye archivos temporales y de compilación del control de versiones.

Funcionalidad principal: ImageScout.swift

El archivo central ImageScout.swift expone una interfaz asíncrona para detectar información de imágenes a partir de una URL. Utiliza un descarga mínima (solo los primeros bytes) para determinar el formato y dimensiones.

import Foundation

public class ImageScout {
   public func analyzeImage(at url: String, completionHandler: @escaping (Error?, CGSize, ImageFormat) -> Void) {
       guard let url = URL(string: url) else {
           completionHandler(NSError(domain: "InvalidURL", code: -1, userInfo: nil), .zero, .unknown)
           return
       }

       var request = URLRequest(url: url)
       request.httpMethod = "HEAD"
       request.setValue("bytes=0-1024", forHTTPHeaderField: "Range")

       URLSession.shared.dataTask(with: request) { data, response, error in
           if let error = error {
               completionHandler(error, .zero, .unknown)
               return
           }

           guard let data = data, !data.isEmpty else {
               completionHandler(NSError(domain: "EmptyResponse", code: -2, userInfo: nil), .zero, .unknown)
               return
           }

           let format = determineImageFormat(from: data)
           let size = calculateDimensions(for: format, from: data)

           completionHandler(nil, size, format)
       }.resume()
   }
}
 

Configuración para integración

El archivo ImageScout.podspec permite incluir la librería mediante CocoaPods:

Pod::Spec.new do |spec|
 spec.name         = "ImageScout"
 spec.version      = "2.1.0"
 spec.summary      = "Fast image type and size detection in Swift"
 spec.description  = "Detects image format and dimensions with minimal download using Swift."
 spec.homepage     = "https://github.com/kaishin/ImageScout"
 spec.license      = { :type => "MIT", :file => "LICENSE" }
 spec.author       = { "Reda Lemeden" => "hello@redalemeden.com" }
 spec.source       = { :git => "https://github.com/kaishin/ImageScout.git", :tag => "v#{spec.version}" }
 spec.platform     = :ios, "8.0"
 spec.source_files = "Sources/ImageScout/**/*.swift"
 spec.requires_arc = true
end
 

Para Swift Package Manager, el Package.swift define el paquete como una biblioteca con un destino de prueba:

// swift-tools-version:5.3
import PackageDescription

let package = Package(
   name: "ImageScout",
   products: [
       .library(name: "ImageScout", targets: ["ImageScout"])
   ],
   dependencies: [],
   targets: [
       .target(name: "ImageScout", dependencies: []),
       .testTarget(name: "ImageScoutTests", dependencies: ["ImageScout"])
   ]
)
 

Este diseño permite una fácil integración en proyectos iOS, macOS y otros entornos compatibles con Swift.

Etiquetas: swift ImageDetection SwiftPackageManager CocoaPods iOS

Publicado el 9-4 16:17