質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Cocoa

CocoaはMac OS X用のアプリケーションを構築する為の主要なフレームワークのひとつです。

Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

0回答

700閲覧

CollectionViewの画像加工ができません

ay49

総合スコア3

Cocoa

CocoaはMac OS X用のアプリケーションを構築する為の主要なフレームワークのひとつです。

Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/06/15 17:38

編集2022/01/12 10:55

###前提・実現したいこと
CollectionViewに表示された複数枚の画像に対して、一斉にコントラストやハイライトを調整し、加工された写真を保存する機能を実装しています

###質問内容
エラーメッセージが全て同じなのでsetValueを含まないのは理解したのですが、具体的にどのように書き換えるべきか対処法を教えて頂けると嬉しいです

###発生している問題・エラーメッセージ
Value of type '[CIFilter]' has no member 'setValue'

###該当のソースコード

swift

1 //入力画像の設定 2 highlightFilter.setValue(ciImageArray, forKey: kCIInputImageKey) 3 saidoFilter.setValue(ciImageArray, forKey: kCIInputImageKey) 4 contrustFilter.setValue(ciImageArray, forKey: kCIInputImageKey) 5 roshutuFilter.setValue(ciImageArray, forKey: kCIInputImageKey) 6 shadowFilter.setValue(ciImageArray, forKey: kCIInputImageKey) 7 8 @IBAction func valueChanged(_ sender: UISlider) { 9 10 for i in 0..<imageArray.count{ 11 highlightLabel.text = String(sender.value) 12 highlightFilter.setValue(sender.value, forKey: "inputHighlightAmount") 13 } 14 if let filteredImage = highlightFilter.outputImage { 15 for i in 0..<imageArray.count{ 16 (collectionView.cellForItem(at: IndexPath(item: i, section: 0)) as! MyCustomCell).cameraImageView.image = UIImage(ciImage: filteredImage) 17 } 18 } 19 }

###以下、全てのコードです

swift

1import UIKit 2import CoreImage 3import Photos 4import DKImagePickerController 5 6class EditViewController: UIViewController,UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { 7 8 @IBOutlet weak var roshutuSlider: UISlider! 9 @IBOutlet weak var roshutuLabel: UILabel! 10 @IBOutlet weak var highlightSlider: UISlider! 11 @IBOutlet weak var highlightLabel: UILabel! 12 @IBOutlet weak var saidoSlider: UISlider! 13 @IBOutlet weak var saidoLabel: UILabel! 14 @IBOutlet weak var contrustSlider : UISlider! 15 @IBOutlet weak var contrustLabel : UILabel! 16 @IBOutlet weak var shadowSlider : UISlider! 17 @IBOutlet weak var shadowLabel : UILabel! 18 @IBOutlet var collectionView : UICollectionView! 19 private let reuseIdentifier = "Cell" 20 21 var imageArray : [UIImage] = [UIImage]() 22 var ciImageArray : [CIImage] = [CIImage]() 23 var highlightFilter: [CIFilter] = [CIFilter]() 24 var roshutuFilter : [CIFilter] = [CIFilter]() 25 var saidoFilter : [CIFilter] = [CIFilter]() 26 var shadowFilter : [CIFilter] = [CIFilter]() 27 var contrustFilter : [CIFilter] = [CIFilter]() 28 let images = UIImage(named: "imageArray") 29 30 var context : CIContext! 31 var context2 : CIContext! 32 var context3 : CIContext! 33 var context4 : CIContext! 34 var context5 : CIContext! 35 var context6 : CIContext! 36 var context7 : CIContext! 37 var context8 : CIContext! 38 var context9 : CIContext! 39 40 override func viewDidLoad() { 41 super.viewDidLoad() 42 //UICollectionViewFlowLayoutをインスタンス化 43 let layout = UICollectionViewFlowLayout() 44 layout.sectionInset = UIEdgeInsets(top: 15, left: 5, bottom: 15, right: 5)//レイアウトを調整 45 layout.minimumInteritemSpacing = 0 46 collectionView.collectionViewLayout = layout 47 48 collectionView.delegate = self 49 collectionView.dataSource = self 50 } 51 52 //表示するセルの数 53 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 54 return imageArray.count 55 } 56 57 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 58 59 //表示するCellの登録 60 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! MyCustomCell 61 62 cell.cameraImageView.image = imageArray[indexPath.row] 63 64 return cell 65 } 66 67 //セルの配置について決める 68 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 69 let horizontalSpace : CGFloat = 10 70 let cellSize : CGFloat = self.view.bounds.width / 3 - horizontalSpace 71 return CGSize(width: cellSize, height: cellSize) 72 } 73 74 //画面表示された直後に呼び出される、毎回呼び出される 75 override func viewDidAppear(_ animated: Bool) { 76 super.viewDidAppear(animated) 77 78 //全ての画像をciImageに変換する 79 for i in 0..<imageArray.count{ 80 guard let ciImageArray = imageArray[i].ciImage ?? CIImage(image: imageArray[i]) else{return} 81 //CIFilterの生成 82 highlightFilter.append( CIFilter(name: "CIHighlightShadowAdjust")!) 83 roshutuFilter.append( CIFilter(name: "CIExposureAdjust")!) 84 contrustFilter.append( CIFilter(name: "CIColorControls")!) 85 saidoFilter.append( CIFilter(name: "CIColorControls")!) 86 shadowFilter.append( CIFilter(name: "CIHighlightShadowAdjust")!) 87 88 //入力画像の設定 89 highlightFilter.setValue(ciImageArray, forKey: kCIInputImageKey) 90 saidoFilter.setValue(ciImageArray, forKey: kCIInputImageKey) 91 contrustFilter.setValue(ciImageArray, forKey: kCIInputImageKey) 92 roshutuFilter.setValue(ciImageArray, forKey: kCIInputImageKey) 93 shadowFilter.setValue(ciImageArray, forKey: kCIInputImageKey) 94 } 95 //ハイライトのスライダー 96 highlightSlider.maximumValue = 1 97 highlightSlider.minimumValue = 0 98 highlightSlider.value = 1 99 100 //露出のスライダー 101 roshutuSlider.maximumValue = 3 102 roshutuSlider.minimumValue = -3 103 roshutuSlider.value = 0 104 105 //彩度のスライダー 106 saidoSlider.maximumValue = 2 107 saidoSlider.minimumValue = 0 108 saidoSlider.value = 1 109 110 //コントラストのスライダー 111 contrustSlider.maximumValue = 1.2 112 contrustSlider.minimumValue = 0.8 113 contrustSlider.value = 1 114 115 // Filterに合わせた最大値、最小値、初期値の設定 116 shadowSlider.maximumValue = 1 117 shadowSlider.minimumValue = -1 118 shadowSlider.value = 0 119 120 //ラベルを表示する 121 highlightLabel.text = String(highlightSlider.value) 122 roshutuLabel.text = String(roshutuSlider.value) 123 saidoLabel.text = String(saidoSlider.value) 124 contrustLabel.text = String(contrustSlider.value) 125 shadowLabel.text = String(shadowSlider.value) 126 127 context = CIContext() 128 context2 = CIContext() 129 context3 = CIContext() 130 context4 = CIContext() 131 context5 = CIContext() 132 context6 = CIContext() 133 context7 = CIContext() 134 context8 = CIContext() 135 context9 = CIContext() 136 } 137 138 @IBAction func valueChanged(_ sender: UISlider) { 139 140 for i in 0..<imageArray.count{ 141 highlightLabel.text = String(sender.value) 142 highlightFilter.setValue(sender.value, forKey: "inputHighlightAmount") 143 } 144 if let filteredImage = highlightFilter.outputImage { 145 for i in 0..<imageArray.count{ 146 (collectionView.cellForItem(at: IndexPath(item: i, section: 0)) as! MyCustomCell).cameraImageView.image = UIImage(ciImage: filteredImage) 147 } 148 } 149 } 150 151 //Valuechanged2,3,4,5は同じ処理を実行したいため中略しました 152 153 @IBAction func back(){ 154 self.dismiss(animated: true, completion: nil) 155 } 156 157 @IBAction func savePhoto(){ 158 for i in 0..<imageArray.count{ 159 UIImageWriteToSavedPhotosAlbum(imageArray[i], nil, nil, nil) 160 } 161 } 162 // 保存結果をアラートで表示する 163 func showResultOfSaveImage(_ image: UIImage, didFinishSavingWithError error: NSError!, contextInfo: UnsafeMutableRawPointer) { 164 165 var title = "保存完了" 166 var message = "カメラロールに保存しました" 167 168 if error != nil { 169 title = "エラー" 170 message = "保存に失敗しました" 171 } 172 173 let alert = UIAlertController(title: title, message: message, preferredStyle: .alert) 174 175 // OKボタンを追加 176 alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) 177 178 // UIAlertController を表示 179 self.present(alert, animated: true, completion: nil) 180 } 181} 182

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2020/06/15 22:08

collectionView.cellForItem(at: IndexPath) は基本的に自分で呼ぶべきメソッドではありません。ビュー (UICollectionView やそのセル) とは独立してデータを管理して、UICollectionView から呼ばれた時に適切な内容をセットする必要があります。
ay49

2020/06/16 02:47 編集

@hoshi-takanori様 ありがとうございます。collectionView.cellForItem(at: IndexPath)以外の表示方法について調べて書き直してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問