2017年5月18日木曜日

画像サイズ変更

画像サイズを縮小したり拡大したりする方法。とりあえず縮小で説明。

要は、UIGraphicsImageContext(オフスクリーンバッファだな)を縮小(拡大)したサイズで作り、そこに元の画像をdrawすればいい。

以下でimageには512*512の画像が入っているとする。それを256*256のContextにdrawすると、Contextの縦横に合わせて画像が縮小されるわけですな。


        //オフスクリーンのコンテキスト作成
        UIGraphicsBeginImageContextWithOptions(CGSize(width: 256, height: 256), false, 0.0) 
        //コンテキストに画像を描画
        image.draw(in: CGRect(x: 0, y: 0, width: 256, height: 256))
        //コンテキストから画像を得る
        myImageView.image = UIGraphicsGetImageFromCurrentImageContext()

        UIGraphicsEndImageContext()


drawする際にCGRectの各値を変更すれば、描画位置を変えたり、縦横を縮小(拡大)して描画することができる。

単純な拡大も、例えば100*100の画像を256*256のコンテキストに描画すれば拡大されるっちゅうわけ。

画像のクロップ(切り抜き)

画像の一部をクロップする方法。(とりあえず矩形で)

たとえば1024*1024の画像があったとして、そのx:100, y:100, width:200, height:200 の部分をクロップしたい場合、
UIImageのcgImage.cropping(to:)でクロップしたい範囲を指定してやれば、クロップした画像がCGImageとして得られるので、それを再びUIImageに変換してやればいい。
か〜んた〜ん♪


    func cropImage(image:UIImage, cropRect:CGRect) -> UIImage {
        let cropRef   = image.cgImage!.cropping(to: cropRect)
        let cropImage = UIImage(cgImage: cropRef!)
        
        return cropImage
    }

スクリーンショット

スクリーンショットの撮りかた。
GraphicsContext(要はメモリ上に作る描画領域=オフスクリーンバッファだな)を作り、そこに画面に表示されてるviewのlayer(bitmapの画像がある…はず)をrenderしてやることでスクリーンショットが撮れるわけですな。

今回はviewの部分だけのキャプチャーなので、画面一番上に時計とかを表示してるステータスバーなんかはキャプチャーされない。
普通にスクリーンショットを撮った時みたいに、そこまで含めたい場合はまた今度調べる。


    func getScreenShot() -> UIImage {
        //viewと同じサイズのコンテキスト(オフスクリーンバッファ)を作成
        let rect = self.view.bounds
        UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
        //現在のviewの中身(スクリーン)をコンテキストに描画
        //viewの中身なのでステータスバーなどは含まれないようだ
        let context: CGContext = UIGraphicsGetCurrentContext()!
        self.view.layer.render(in: context)
        //スクリーンがキャプチャされたコンテキストからUIImageを作成
        let capturedImage : UIImage = UIGraphicsGetImageFromCurrentImageContext()!
        //コンテキストの扱いを終了
        UIGraphicsEndImageContext()
        
        return capturedImage

    }


上にボタンとかを重ねてて、それをキャプチャーしたくない場合は、直前でhiddenして直後にまた表示すればいい。

Retinaディスプレイの場合、たとえばiPadの768*1024のスクリーンショットでも、倍の1536*2048の画像ができるので、それをさらに加工したりするときは注意。


このUIGraphicsBeginImageContext() 〜 UIGraphicsEndImageContext()で囲んだ間でオフスクリーンを操作するやり方はいろいろ使い道がありそうだ。

参考サイト

2017年5月12日金曜日

お上からのメール/Your iOS Distribution will expire in 30 days.

Your iOS Distribution will expire in 30 days. というタイトルで、 以下のことが書かれたメールがアップルデベロッパーから届いた。
This certificate will no longer be valid in 30 days. To create a new certificate, visit Certificates, Identifiers & Profiles in your account.
Certificate: iOS DistributionTeam Name: xxxxxxxxxxxxxxx
To learn more about expired certificates, visit the certificates support page
この証明書は30日間有効ではなくなります。 新しい証明書を作成するには、アカウントの証明書、識別子、およびプロファイルにアクセスしてください。 
翻訳するとこうなった。

リンク先に飛ぶとアップルデベロッパーの iOS Certificates のページが開く。
そこのiOS Distribution(配布)についての方が約一月後に切れるようだ。これなんだったっけ?
iOS Development(開発)の方は11月まで有効。
今年の1月にはアップルデベロッパーに金払って年間登録を更新してるから、それじゃないよね。
実機にインストールしたり、AppStoreで配布したりするのに証明書が必要だったと思うので、それだと思うけど、毎年こんな風に更新だか再作成だかを求められたっけ?

CertificatesがPendingになってるのを開いてみたら、以下のようになってて、デバイスをMacに接続してXcodeでOrganizerウィンドウを開き、「Use for Development」をクリックすると自動的に証明書が生成されるって書いてある。

でも今の状態で接続しても、過去にアップロードしたアプリが出てくるだけで、クリックするようなボタンはない。これが今回のメールの件と関係あるかどうかもよくわからんし。

調べてみると、期限が切れたら「Request Certificate」ってボタンが出るんで、それを押してゴニョゴニョすればいいような?
キーチェーンアクセスを起動してどうのこうのするやり方もあったみたい。
iOS Certificatesの画面で「+」を押して作り直す方法も。

正直よくわからんので、期限が切れるまで様子を見てみるか。

追記:念のため販売中のアプリのうち、プロジェクトのAutomatically manage signingのチェックがされてないのがあったので、そいつをチェックしてみた。
これが今後関係してくれるかはわからん。

参考サイト