9
変更します。以下のスピーディコードを使用して特定のピクセルカラーを取得できますが、同じ色のピクセルを有し、それを消去することができない周辺領域。例えばエリアは同じピクセルカラーで覆われており、同じ色で塗りつぶされた特定のピクセルとピクセルエリアの色を消去する方法を
import UIKit
class ColorOfImage: UIImageView {
var lastColor:UIColor? = nil
/*
// Only override draw() if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func draw(_ rect: CGRect) {
// Drawing code
}
*/
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
if self.isHidden == true {
self.next?.touchesEnded(touches, with: event)
return
}
let touch: UITouch = touches.first!
var point:CGPoint = touch.location(in: self)
self.lastColor = self.getPixelColorAtLocation(point:point)
}
public func createARGBBitmapContext(inImage: CGImage) -> CGContext {
var bitmapByteCount = 0
var bitmapBytesPerRow = 0
//Get image width, height
let pixelsWide = inImage.width
let pixelsHigh = inImage.height
// 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 = CGContext(data: bitmapData, width: pixelsWide, height: pixelsHigh, bitsPerComponent: 8, bytesPerRow: bitmapBytesPerRow, space: colorSpace, bitmapInfo: CGImageAlphaInfo.premultipliedFirst.rawValue)
// Make sure and release colorspace before returning
return context!
}
public func getPixelColorAtLocation(point:CGPoint) -> UIColor {
// Create off screen bitmap context to draw the image into. Format ARGB is 4 bytes for each pixel: Alpa, Red, Green, Blue
var point = point
var context:CGContext? = nil
context = self.createARGBBitmapContext(inImage: (self.image?.cgImage)!)
if context == nil {
return UIColor.white
}
var pixelsWide = (self.image?.cgImage)!.width
var pixelsHigh = (self.image?.cgImage)!.height
var rect = CGRect(x:0, y:0, width:Int(pixelsWide), height:Int(pixelsHigh))
var xScale:CGFloat = CGFloat(pixelsWide)/self.frame.size.width
var yScale:CGFloat = CGFloat(pixelsHigh)/self.frame.size.height
point.x = point.x * xScale
point.y = point.y * yScale
var x:CGFloat = 1.0
if (self.image?.responds(to: #selector(getter: self.image?.scale)))! {
x = (self.image!.scale)
}
//Clear the context
context?.clear(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.
context?.draw((self.image?.cgImage)!, in: rect)
// Now we can get a pointer to the image data associated with the bitmap
// context.
let data = context?.data
// let dataType = UnsafePointer<UInt8>(data)
var color:UIColor? = nil
if data != nil {
let dataType = data?.assumingMemoryBound(to: UInt8.self)
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]
color = UIColor(red: CGFloat(red!)/255.0, green: CGFloat(green!)/255.0, blue: CGFloat(blue!)/255.0, alpha: CGFloat(alpha!)/255.0)
}
else
{
}
// Free image data memory for the context
free(data)
return color!;
}
}
iはUIImageに特定の座標にタッチした場合は、それは色を取得し、同じ色を有する画素と周辺画素を消去しており、これらすべてはerase.Canなければなりません私はこれについて私を助けてください。
これは、右の0,0座標から色を変更しますこれはFLOODFILLアルゴリズムのように同じであるが、その代わりに、私は、特定の色のピクセルを取得したいですその座標から同じ色のピクセルで覆われた領域とその領域を消去します。 – Uttam
下のビデオをチェックしても、緑のピクセルが選択された画像をクリックしたときと同じように、私はそれを見ています。画像のタッチ位置座標をクリックすると、ピクセルの色と同じ関連するピクセルを選択する必要があります。 https://www.youtube.com/watch?v=DG38mAWKE1c – Uttam
誰でもこのことを教えてください。 – Uttam