How do I load and edit a bitmap file at the pixel level in Swift for iOS?

后端 未结 1 962
故里飘歌
故里飘歌 2020-12-05 16:16

I want to manipulate an image at the pixel level in Swift. This question was answered for objective c: How do I access and manipulate JPEG image pixels?, but I would like t

相关标签:
1条回答
  • 2020-12-05 16:59

    This is how I am getting a color from an image at a touch location.

    I translated this answer: https://stackoverflow.com/a/12579413/359578

    (This sample does no error checking for nil)

    func createARGBBitmapContext(inImage: CGImage) -> CGContext {
      var bitmapByteCount = 0
      var bitmapBytesPerRow = 0
    
      //Get image width, height
      let pixelsWide = CGImageGetWidth(inImage)
      let pixelsHigh = CGImageGetHeight(inImage)
    
      // Declare the number of bytes per row. Each pixel in the bitmap in this
      // example is represented by 4 bytes; 8 bits each of red, green, blue, and
      // alpha.
      bitmapBytesPerRow = Int(pixelsWide) * 4
      bitmapByteCount = bitmapBytesPerRow * Int(pixelsHigh)
    
      // Use the generic RGB color space.
      let colorSpace = CGColorSpaceCreateDeviceRGB()
    
      // Allocate memory for image data. This is the destination in memory
      // where any drawing to the bitmap context will be rendered.
      let bitmapData = malloc(bitmapByteCount)
    
      // Create the bitmap context. We want pre-multiplied ARGB, 8-bits
      // per component. Regardless of what the source image format is
      // (CMYK, Grayscale, and so on) it will be converted over to the format
      // specified here by CGBitmapContextCreate.
      let context = CGBitmapContextCreate(bitmapData, pixelsWide, pixelsHigh, 8, bitmapBytesPerRow, colorSpace, CGImageAlphaInfo.PremultipliedFirst.rawValue)
    
      // Make sure and release colorspace before returning
      return context!
    }
    
    func getPixelColorAtLocation(point:CGPoint, inImage:CGImageRef) -> NSColor {
      // Create off screen bitmap context to draw the image into. Format ARGB is 4 bytes for each pixel: Alpa, Red, Green, Blue
      let context = self.createARGBBitmapContext(inImage)
    
      let pixelsWide = CGImageGetWidth(inImage)
      let pixelsHigh = CGImageGetHeight(inImage)
      let rect = CGRect(x:0, y:0, width:Int(pixelsWide), height:Int(pixelsHigh))
    
      //Clear the context
      CGContextClearRect(context, rect)
    
      // Draw the image to the bitmap context. Once we draw, the memory
      // allocated for the context for rendering will then contain the
      // raw image data in the specified color space.
      CGContextDrawImage(context, rect, inImage)
    
      // Now we can get a pointer to the image data associated with the bitmap
      // context.
      let data = CGBitmapContextGetData(context)
      let dataType = UnsafePointer<UInt8>(data)
    
      let offset = 4*((Int(pixelsWide) * Int(point.y)) + Int(point.x))
      let alpha = dataType[offset]
      let red = dataType[offset+1]
      let green = dataType[offset+2]
      let blue = dataType[offset+3]
      let color = NSColor(red: CGFloat(red)/255.0, green: CGFloat(green)/255.0, blue: CGFloat(blue)/255.0, alpha: CGFloat(alpha)/255.0)
    
      // Free image data memory for the context
      free(data)
      return color;
    }
    
    0 讨论(0)
提交回复
热议问题