GPUImageを使ってカメラアプリなんかを作っている時の話。
GPUImageViewはデフォルトではコンテンツを自身のフレーム内にアスペクトを維持した状態で全体を表示するようになっている。
そのため、表示するコンテンツ(GPUImageStillCameraとか)の画角とGPUImageViewの画角が違うと、上下or左右にviewの背景色が見えてしまう。
それを、view全体を埋めるように表示するには、GPUImageViewのfillModeを設定してやるとよい。
GPUImageView *imageView = [[GPUImageView alloc] initWithFrame:self.frame];
gpuimageView.fillMode = kGPUImageFillModePreserveAspectRatioAndFill;
GPUImageView.fillModeに設定できる値は以下の通り。
GPUImageView.fillModeに設定できる値
typedef enum {
kGPUImageFillModeStretch, // アスペクト比を変更して、画像の高さと幅をviewに合わせる
kGPUImageFillModePreserveAspectRatio, //アスペクト比を保持して、 画像をviewの中に収める。隙間はviewの背景色で埋められる
kGPUImageFillModePreserveAspectRatioAndFill //アスペクト比を保持して、隙間なくviewを埋めるようにスケールを調整する
} GPUImageFillModeType;
ちなみに、普通のUIViewの場合は、UIViewのcontentModeを設定してやればいい。
UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.frame];
imageView. contentMode = kGPUImageFillModePreserveAspectRatioAndFill;
UIView.contentModeに設定できる値
typedef NS_ENUM(NSInteger, UIViewContentMode) {
UIViewContentModeScaleToFill,
UIViewContentModeScaleAspectFit, //アスペクト比を保持して、 画像をviewの中に収める。余白が透明になるのが、GPUImageFillModeTypeと違うところ
UIViewContentModeScaleAspectFill, //アスペクト比を保持して、隙間なくviewを埋めるようにコンテンツのスケールを調整する
UIViewContentModeRedraw, //boundsが変更されるたびに再描画する
UIViewContentModeCenter, //コンテンツのサイズは保持したまま、位置が調整される
UIViewContentModeTop,
UIViewContentModeBottom,
UIViewContentModeLeft,
UIViewContentModeRight,
UIViewContentModeTopLeft,
UIViewContentModeTopRight,
UIViewContentModeBottomLeft,
UIViewContentModeBottomRight,
};
GPUImageの時もこれで出来ると思ってたらダメだったという話。