###前提・実現したいこと
配列dataArrayに関数の戻り値である配列の中身の要素だけ追加したいです。
下記のcreateRGB(x1: Int,y1: Int) -> [UInt8]
を使用し,戻り値である[r,g,b]
を配列dataArrayに追加する際に,dataArray = [[r,g,b]...]
ではなく,dataArray = [r,g,b,...]
としたいです。
###発生している問題・エラーメッセージ
関数の戻り値で配列を指定しており,dataArrayに追加するには,dataArrayを多次元配列とすることしか自分では思いつかなかった。しかし,dataArrayは普通の配列である必要があり,どうすればよいかわからず困っています。
###該当のソースコード
swift
1class ViewController: UIViewController { 2 var dataArray = [UInt8]() 3... 4override func viewDidLoad() { 5 super.viewDidLoad() 6 // Do any additional setup after loading the view, typically from a nib. 7 8 do{ 9 let image = #imageLiteral(resourceName: "IMG_1758").cgImage 10 if let data1 = Transformation.init(inputImage: image!, OutSizeX: 3024, OutSizeY: 4032, Theta2: 75.0) { 11 for y in 0...4032{ 12 for x in 0...3024{ 13 dataArray.append(data1.createRGB(x1: x, y1: y)) 14 } 15 } 16 } 17 } 18 } 19 20//入力画像から出力画像のRGB配列を作成するクラス 21 class Transformation { 22 //変数の設定 23 var outSizeX : Int 24 var outSizeY : Int 25 var pixelData : Data 26 var bytesPerRow : Int 27 let bytesPerPixel = 4 28 var RGB : [UInt8] 29 var theta2 : Double 30 var tanTheta : Double 31 var dIn : Double 32 var fIn : Double 33 var dOut : Double 34 var fOut : Double 35 var InCenterX : Double 36 var InCenterY : Double 37 var outCenterX : Double 38 var outCenterY : Double 39 var inputImage1 : CGImage 40 41 var width : Int 42 var height : Int 43 44 45 //変数の初期値を定める 46 init? (inputImage: CGImage, OutSizeX : Int, OutSizeY : Int, Theta2 : Double) { 47 outSizeX = OutSizeX 48 outSizeY = OutSizeY 49 pixelData = inputImage.dataProvider!.data! as Data 50 bytesPerRow = inputImage.bytesPerRow 51 RGB = [] 52 theta2 = Theta2 53 tanTheta = tan(0.5*theta2*(Double.pi)/180) 54 dIn = 0.5*sqrt(pow(Double(inputImage.width),2) + pow(Double(inputImage.height), 2)) 55 fIn = dIn / tanTheta 56 dOut = 0.5*sqrt(pow(Double(outSizeX),2) + pow(Double(outSizeY), 2)) 57 fOut = 2*dOut / M_PI 58 inputImage1 = inputImage 59 InCenterX = 0.5*Double(inputImage.width) 60 InCenterY = 0.5*Double(inputImage.height) 61 outCenterX = 0.5*Double(outSizeX) 62 outCenterY = 0.5*Double(outSizeY) 63 64 pixelData = inputImage.dataProvider!.data! as Data 65 width = inputImage.width 66 height = inputImage.height 67 bytesPerRow = inputImage.bytesPerRow 68 69 guard outSizeX>0, outSizeY>0 else { return nil } 70 } 71 //出力画像のRGB配列を作成する関数 72 func createRGB(x1: Int,y1: Int) -> [UInt8]{ 73 //変数の定義 74 var yOutX : Double 75 var yOutY : Double 76 var yOut : Double 77 var inPixelI : Int 78 var inPixelJ : Int 79 var yIn : Double 80 var scale : Double 81 // var rgb : [UInt8] 82 83 //全ピクセルに対して処理を行う 84 for y in 0..<y1{ 85 for x in 0..<x1{ 86 87 //出力画像の中心座標から任意のピクセルまでの距離 88 yOutX = Double(x) - outCenterX + 0.5 89 yOutY = Double(y) - outCenterY + 0.5 90 yOut = sqrt(pow(yOutX,2) + pow(yOutY,2)) 91 92 93 //yOutの値から,条件分岐 94 if yOut == 0 { 95 inPixelI = Int(round(InCenterX-0.5)) 96 inPixelJ = Int(round(InCenterY-0.5)) 97 //求めた入力画像の座標におけるピクセルのRGB情報を,出力画像のピクセルのRGB情報に上書き 98 let pixelInfo: Int = (Int(bytesPerRow) * inPixelJ + inPixelI * 4) 99 let r = UInt8(pixelData[pixelInfo]) 100 let g = UInt8(pixelData[pixelInfo+1]) 101 let b = UInt8(pixelData[pixelInfo+2]) 102 103 RGB.append(r) 104 RGB.append(g) 105 RGB.append(b) 106 107 108 return (RGB) 109 110 111 112 }else { 113 //射影変換を行い,出力画像でのyOutが入力画像ではどのような値になるか調べる 114 yIn = fIn*tan(yOut/fOut) 115 scale = yIn / yOut 116 //yInから,出力画像の任意のピクセルに対応する,入力画像のピクセルの座標を調べる 117 inPixelI = Int(round(yOutX*scale + InCenterX - 0.5)) 118 inPixelJ = Int(round(yOutY*scale + InCenterY - 0.5)) 119 //入力画像のピクセルのRGB情報を得る 120 121 if (inPixelI < Int(x1)) && (inPixelJ < Int(y1)) { 122 let pixelInfo: Int = (Int(bytesPerRow) * inPixelJ + inPixelI * 4) 123 let r = UInt8(pixelData[pixelInfo]) 124 let g = UInt8(pixelData[pixelInfo+1]) 125 let b = UInt8(pixelData[pixelInfo+2]) 126 127 RGB.append(r) 128 RGB.append(g) 129 RGB.append(b) 130 131 return RGB 132 133 }else { 134 let y:UInt8 = 0 135 let r = UInt8(0) 136 let g = UInt8(0) 137 let b = UInt8(0) 138 139 RGB.append(r) 140 RGB.append(g) 141 RGB.append(b) 142 return RGB 143 144 } 145 } 146 } 147 return ([0]) 148 } 149 150 151} 152
###試したこと
戻り値をタプルとしたり,多次元配列を普通の配列に直せないか調べたのですがうまくいきませんでした。
###補足情報(言語/FW/ツール等のバージョンなど)
swift3.0
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/12 03:42
2018/01/12 03:44
2018/01/12 03:53
2018/01/12 03:53
2018/01/12 03:55
2018/01/12 04:48