本 SDK を使用したアプリケーションが動作するスマートフォンと THETAを無線 LAN 接続しておきます。
import THETAClient
// THETAがIPアドレスを指定して作成する
ThetaRepository.Companion.shared.doNewInstance(
endPoint:"http://<THETA IP ADDRESS>"
) {response, error in
if let instance = response {
theta = instance
}
if let thetaError error {
// handle error
}
}
THETA IP ADDRESS
モード | アドレス |
---|---|
ダイレクトモード | 192.168.1.1 |
その他 | 割り当てた IP アドレス |
Theta から画像や動画を URLSessionを使ってダウンロードする場合は、plainな接続となりますので、接続先のアドレス(デフォルト 192.168.1.1)に応じてInfo.plist への接続許可設定が必要になります。デフォルトの場合のInfo.plist の例を示します。なお、XcodeのSigning&Capabilities
→App Transport Security Exception
でも追加設定することができます。
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "<http://www.apple.com/DTDs/PropertyList-1.0.dtd>">
<plist version="1.0">
<dict>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<false/>
<key>NSExceptionDomains</key>
<dict>
<key>192.168.1.1</key>
<dict>
<key>NSIncludesSubdomain</key>
<false/>
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSTemporaryExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
</dict>
</dict>
</dict>
</plist>
まずThetaRepository.getPhotoCaptureBuilder()
を使って撮影設定を行い、PhotoCapture
オブジェクトを生成します。
Task {
do {
let photoCapture: PhotoCapture = try await withCheckedThrowingContinuation {continuation in
PhotoCaptureBuilder()
.setIsoAutoHighLimit(iso: ThetaRepository.IsoAutoHighLimitEnum.iso1000)
.setFileFormat(fileFormat: ThetaRepository.PhotoFileFormat.image5k)
.build {capture, error in
if let photoCapture = capture {
continuation.resume(returning: photoCapture)
}
if let thetaError = error {
continuation.resume(throwing: thetaError)
}
}
}
} catch {
// catch thetaError
}
}
上の例では ISO 感度の最大値を 1000 に、ファイルフォーマットを image5kに設定しています。
プレビューを表示する方法はプレビューを表示するをご覧ください。
次にPhotoCapture.takePicture(callback:)
を呼んで静止画を撮影します。以下のようにPhotoCaptureTakePictureCallback
を実装したコールバック用クラスを作成して呼び出します。
do {
class Callback: PhotoCaptureTakePictureCallback {
let callback: (_ fileUrl: String?, _ error: Error?) -> Void
init(_ callback: @escaping (_ fileUrl: String?, _ error: Error?) -> Void) {
self.callback = callback
}
func onSuccess(fileUrl: String) {
callback(fileUrl, nil)
}
func onError(exception: ThetaRepository.ThetaRepositoryException) {
callback(nil, exception as? Error)
}
}
let fileUrl: String = try await withCheckedThrowingContinuation {continuation in
photoCapture.takePicture(
callback: Callback {fileUrl, error in
if let photoUrl = fileUrl {
continuation.resume(returning: photoUrl)
}
if let thetaError = error {
continuation.resume(throwing: thetaError)
}
}
)
}
// send GET request for fileUrl and receive a JPEG file
} catch {
// catch error while take picture
}
露出補正 - setExposureCompensation(value:ThetaRepository.ExposureCompensationEnum)
値 | 補正値 | 備考 |
---|---|---|
m20 | -2.0f | |
m17 | -1.7f | |
m13 | -1.0f | |
m07 | -0.7f | |
m03 | -0.3f | |
zero | 0.0f | デフォルト |
p03 | 0.3f | |
p07 | 0.7f | |
p13 | 1.0f | |
p17 | 1.7f | |
p20 | 2.0f |
露出遅延設定 - setExposureDelay(delay:ThetaRepository.ExposureDelayEnum) takePictureコマンドと露出開始間の遅延時間(=セルフタイマー)
値 | 遅延時間(秒) | 備考 |
---|---|---|
delayOff | 0 | デフォルト |
delay1 | 1 | |
delay2 | 2 | |
delay3 | 3 | |
delay4 | 4 | |
delay5 | 5 | |
delay6 | 6 | |
delay7 | 7 | |
delay8 | 8 | |
delay9 | 9 | |
delay10 | 10 |
露出プログラム - setExposureProgram(program:ThetaRepository.ExposureProgramEnum)
値 | 内容 | 備考 |
---|---|---|
manual | 手動 | |
normalProgram | 通常のプログラム | |
aperturePriority | 絞り優先 | |
shutterPriority | シャッター優先 | |
isoPriority | ISO 優先 |
ファイルフォーマット - setFileFormat(fileFormat:ThetaRepository.PhotoFileFormatEnum)
値 | タイプ | 幅 | 高さ | S | SC | V | Z1 | X |
---|---|---|---|---|---|---|---|---|
image2k | jpeg | 2048 | 1024 | ○ | ○ | × | × | × |
image5k | jpeg | 5376 | 2688 | ○ | ○ | ○ | × | × |
image67k | jpeg | 6720 | 3360 | × | × | × | ○ | × |
rawP67k | raw+ | 6720 | 3360 | × | × | × | ○ | × |
image55k | jpeg | 5504 | 2752 | × | × | × | × | ○ |
image11k | jpeg | 11008 | 5504 | × | × | × | × | ○ |
画像処理 - setFilter(filter:ThetaRepository.Filter)
値 | 内容 | 備考 |
---|---|---|
off | なし | |
noiseReduction | ノイズ軽減 | |
hdr | HDR | デフォルト |