回答編集履歴

1

質問者コメントに対して、こちらでのテスト結果を追記

2017/06/05 19:27

投稿

Bongo
Bongo

スコア10807

test CHANGED
@@ -17,3 +17,211 @@
17
17
  返値
18
18
 
19
19
  新しいデータプロバイダ。あなたはCGDataProviderReleaseを用いてこのオブジェクトを解放する責任があります。
20
+
21
+
22
+
23
+ [追記]
24
+
25
+ 失礼しました、CGDataProviderの解放も自動的に面倒を見てくれるようですね。ろくに確認せず投稿したのはまずかったです。
26
+
27
+ というわけで少し試したのですが、私の環境ですと、少なくともシミュレータではコールバックは呼ばれるようでした。申し訳ないですが実機テストはちょっとしたトラブルのため試せませんでした(「実機テスト時の処理が固まる」ということは、シミュレータでは正しくコールバックが呼ばれるのでしょうか)。
28
+
29
+ 以下のようなコードで試しました。
30
+
31
+
32
+
33
+ ###ViewController.swift
34
+
35
+ `viewDidAppear`で加工後画像を生成して加工後用のイメージビューにセットし、削除ボタン押下でnilをセットしました。
36
+
37
+ ```swift
38
+
39
+ import UIKit
40
+
41
+
42
+
43
+ class ViewController: UIViewController {
44
+
45
+
46
+
47
+ @IBOutlet weak var imageView: UIImageView!
48
+
49
+ @IBOutlet weak var processedImageView: UIImageView!
50
+
51
+
52
+
53
+ override func viewDidLoad() {
54
+
55
+ super.viewDidLoad()
56
+
57
+ // Do any additional setup after loading the view, typically from a nib.
58
+
59
+ }
60
+
61
+
62
+
63
+ override func viewDidAppear(_ animated: Bool) {
64
+
65
+ let tImage = TransparentImage()
66
+
67
+ if let image = self.imageView.image
68
+
69
+ {
70
+
71
+ let processedImage = tImage.transparentImage(image: image)
72
+
73
+ self.processedImageView.image = processedImage
74
+
75
+ }
76
+
77
+ }
78
+
79
+
80
+
81
+ override func didReceiveMemoryWarning() {
82
+
83
+ super.didReceiveMemoryWarning()
84
+
85
+ // Dispose of any resources that can be recreated.
86
+
87
+ }
88
+
89
+
90
+
91
+ @IBAction func deleteImage(_ sender: UIButton) {
92
+
93
+ self.processedImageView.image = nil
94
+
95
+ print("加工後画像を削除")
96
+
97
+ }
98
+
99
+
100
+
101
+ }
102
+
103
+ ```
104
+
105
+
106
+
107
+ ###TransparentImage.swift
108
+
109
+ 質問者さんご提示のものとほとんど同じですが、`// print ("colorSpaceRef:\(colorSpaceRef)")`を`print("colorSpaceRef:\(String(describing: colorSpaceRef?.name))")`にして、念のためカラースペースも表示させてみました。
110
+
111
+ ```swift
112
+
113
+ import UIKit
114
+
115
+
116
+
117
+ class TransparentImage: NSObject {
118
+
119
+ func transparentImage (image: UIImage) -> UIImage{
120
+
121
+
122
+
123
+ //画面に表示されたものと同じ画像が渡ってくる。拡大、縮小されていればその画像。
124
+
125
+ var editedimage:UIImage //あとでletに変える
126
+
127
+ let width :Int = Int((image.cgImage!.width))
128
+
129
+ let height :Int = Int((image.cgImage!.height))
130
+
131
+ let imageData = image.cgImage!.dataProvider!.data //cgimageのデータ
132
+
133
+ let datalenght = CFDataGetLength(imageData)
134
+
135
+ var rawData = [UInt8](repeating: 0, count: datalenght)
136
+
137
+ CFDataGetBytes(imageData,CFRange(location: 0, length: datalenght),&rawData) //画像データをrawDataへ転送
138
+
139
+ print("画像のdatalengthの長さ\(datalenght)")
140
+
141
+ print("初期画像のサイズ cgimage width:\(width)")
142
+
143
+ print("初期画像のサイズ cgimage height:\(height)")
144
+
145
+ print("初期画像のサイズ uiimage width:\(image.size.width)")
146
+
147
+ print("初期画像のサイズ uiimage width:\(image.size.height)")
148
+
149
+ print("AlphaInfo:\(image.cgImage!.alphaInfo.rawValue)")
150
+
151
+ print("scale:\(image.scale)")
152
+
153
+
154
+
155
+ // ###画像の生成###
156
+
157
+ let provider = CGDataProvider(dataInfo: nil,data: rawData, size: datalenght,releaseData: releaseData)
158
+
159
+ let colorSpaceRef = image.cgImage!.colorSpace
160
+
161
+ let bitmapInfo = image.cgImage!.bitmapInfo
162
+
163
+ let bitsPerComponent:Int = image.cgImage!.bitsPerComponent
164
+
165
+ let bitsPerPixel = image.cgImage!.bitsPerPixel
166
+
167
+ let bytesPerRow = image.cgImage!.bytesPerRow
168
+
169
+ let cgImage = CGImage(width: width, height: height, bitsPerComponent: bitsPerComponent, bitsPerPixel: bitsPerPixel, bytesPerRow:bytesPerRow, space: colorSpaceRef!, bitmapInfo: bitmapInfo, provider: provider!, decode: nil, shouldInterpolate: false, intent: .defaultIntent)
170
+
171
+ editedimage = UIImage(cgImage:cgImage!, scale:image.scale, orientation:image.imageOrientation)
172
+
173
+ print("colorSpaceRef:\(String(describing: colorSpaceRef?.name))")
174
+
175
+ print("bitmapInfo:\(bitmapInfo)")
176
+
177
+ print("加工後画像幅:\(editedimage.size.width)")
178
+
179
+ print("加工後画像高さ:\(editedimage.size.height)")
180
+
181
+ print("bitsPerComponent:\(bitsPerComponent)")
182
+
183
+ print("bitsPerPixel:\(bitsPerPixel)")
184
+
185
+ print("bytesPerRow:\(bytesPerRow)")
186
+
187
+
188
+
189
+
190
+
191
+ return editedimage
192
+
193
+ }
194
+
195
+
196
+
197
+ let releaseData: CGDataProviderReleaseDataCallback = { (info: UnsafeMutableRawPointer?, data: UnsafeRawPointer, size: Int) -> () in
198
+
199
+ // https://developer.apple.com/reference/coregraphics/cgdataproviderreleasedatacallback
200
+
201
+ print("callback")
202
+
203
+ return
204
+
205
+ }
206
+
207
+ }
208
+
209
+ ```
210
+
211
+
212
+
213
+ ###Main.storyboard
214
+
215
+ イメージビュー2枚とボタン1個を下図のように配置しました。
216
+
217
+ ![ストーリーボード](be6a64ed4937328a309ad0f26999b490.png)
218
+
219
+
220
+
221
+ ###実行時の出力
222
+
223
+ ![ムービー](3a62b549e29bed5a56e82ff5c12d2da2.gif)
224
+
225
+
226
+
227
+ 実機テストができるようになりましたら、そちらも試してみようかと思います。