[ad_1]
I was searching online for ways to encode an image into 8 bits, but I discovered that 8 bits only support 256 colors, so I am wrong. I am making a pixel art app, but I want to be limited to 16 different colors when making the picture. I have codes here, they work perfectly. I was able to zoom the image, color the pixel, etc., but I need to find the 16 top colours in the image. “colorsSet.count” is what I use to find colors from images. There are 15,653 different colors in total. There should only be 16. Any idea?
Here my full code:
let pixelNumber = 128
class TheDemo: UIViewController, UIScrollViewDelegate {
let scrollImage = UIScrollView()
let imageDemo = UIView()
var originalImage = UIImage()
override func viewDidLoad() {
super.viewDidLoad()
originalImage = (UIImage(named: "Demo2")?.resizeUI(size: CGSize(width: pixelNumber, height: pixelNumber))!)!
scrollImage.frame = view.bounds
scrollImage.minimumZoomScale = 1
scrollImage.maximumZoomScale = 25
scrollImage.delegate = self
imageDemo.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.width)
imageDemo.center = view.center
var numberOfBoxCreated = 0
let boxSizeSet = view.frame.width / CGFloat(pixelNumber)
DispatchQueue.main.async {
let getColorPixel = self.findColors(self.originalImage)
var colorsSet = [UIColor]()
for checkColorSet in getColorPixel { if !colorsSet.contains(checkColorSet) { colorsSet.append(checkColorSet) } }
print("Number of color: \(colorsSet.count)")
for colX in 0..<pixelNumber {
for rowX in 0..<pixelNumber {
let boxBtn = UIView()
boxBtn.frame = CGRect(x: CGFloat(colX) * boxSizeSet, y: CGFloat(rowX) * boxSizeSet, width: boxSizeSet, height: boxSizeSet)
boxBtn.backgroundColor = getColorPixel[numberOfBoxCreated]
self.imageDemo.addSubview(boxBtn)
numberOfBoxCreated += 1
}
}
}
scrollImage.addSubview(imageDemo)
view.addSubview(scrollImage)
}
func viewForZooming(in scrollView: UIScrollView) -> UIView? {
imageDemo
}
func findColors(_ image: UIImage) -> [UIColor] {
let pixelsWide = pixelNumber
let pixelsHigh = pixelNumber
guard let pixelData = image.cgImage?.dataProvider?.data else { return [] }
let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)
var imageColors: [UIColor] = []
for x in 0..<pixelsWide {
for y in 0..<pixelsHigh {
let point = CGPoint(x: x, y: y)
let pixelInfo: Int = ((pixelsWide * Int(point.y)) + Int(point.x)) * 4
let color = UIColor(red: CGFloat(data[pixelInfo]) / 255.0,
green: CGFloat(data[pixelInfo + 1]) / 255.0,
blue: CGFloat(data[pixelInfo + 2]) / 255.0,
alpha: CGFloat(data[pixelInfo + 3]) / 255.0)
imageColors.append(color)
}
}
return imageColors
}
}
extension UIImage {
func resizeUI(size:CGSize) -> UIImage? {
UIGraphicsBeginImageContextWithOptions(size, true, self.scale)
self.draw(in: CGRect(origin: .zero, size: size))
let resizedImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return resizedImage
}
}
[ad_2]