前提・実現したいこと
読み込んだ画像をスライダーの数値によってリサイズ、配列操作をした後に表示したい
発生している問題・エラーメッセージ
画像が崩れる
該当のソースコード
Swift
1 { 2 r2 = Slider!.value 3 Katati = UIImage(named: "image.png") 4 let imageResize:UIImage = resize(image: Katati, width: Double(r2*2)) 5 6 var katati_pixels = getByteArrayFromImage(imageRef: imageResize.cgImage!) 7 8 //////////// 9 配列操作 10 //////////// 11 12 let result_pix = RBGImage(data: katati_pixels, width: r2*2, height:r2*2) 13 Button.setImage(UIImage(cgImage: result_pix!), for: UIControl.State.normal) 14 } 15 16 17 func getByteArrayFromImage(imageRef: CGImage) -> [UInt8] { 18 19 let data = imageRef.dataProvider!.data 20 let length = CFDataGetLength(data) 21 var rawData = [UInt8](repeating: 0, count: length) 22 CFDataGetBytes(data, CFRange(location: 0, length: length), &rawData) 23 return rawData 24 25 } 26 func RBGImage(data: [UInt8], width: Int, height: Int) -> CGImage? { 27 28 let bitsPerComponent = 8 29 let bitsPerPixel = bitsPerComponent * 4 30 let bytesPerRow = bitsPerPixel * width / 8 31 32 let providerRef = CGDataProvider( 33 data: NSData(bytes: data, length: height * width * 4) 34 ) 35 36 let cgimage = CGImage( 37 width: width, 38 height: height, 39 bitsPerComponent: bitsPerComponent, 40 bitsPerPixel: bitsPerPixel, 41 bytesPerRow: bytesPerRow, 42 space: CGColorSpaceCreateDeviceRGB(), 43 bitmapInfo: CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue), 44 provider: providerRef!, 45 decode: nil, 46 shouldInterpolate: false, 47 intent: .defaultIntent 48 ) 49 return cgimage 50 } 51 52 func resize(image: UIImage, width: Double) -> UIImage { 53 54 let aspectScale = image.size.height / image.size.width 55 56 let resizedSize = CGSize(width: width, height: width * Double(aspectScale)) 57 print("height",width * Double(aspectScale)) 58 59 UIGraphicsBeginImageContext(resizedSize) 60 image.draw(in: CGRect(x: 0, y: 0, width: resizedSize.width, height: resizedSize.height)) 61 print("resizedSize.width",resizedSize.width) 62 let resizedImage = UIGraphicsGetImageFromCurrentImageContext() 63 UIGraphicsEndImageContext() 64 65 return resizedImage! 66 } 67
試したこと
スライダーの値によっては正常に動作するのですが、リサイズ後の画像のwidth×height×4と[Uint8]の配列の長さが一致しないことが多々あり、その場合に上手く画像が表示されません
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
(回答したので質問取り下げます)
回答1件
あなたの回答
tips
プレビュー