元の画像:
フィルタリングされた画像:
UIImages(携帯電話のカメラロールの写真)を正方形に切り抜こうとしています。これが私が使用しているコードの一部です。ここで、「image」はトリミングされている画像です。
if( image.size.height > image.size.width )
{
dimension = image.size.width;
imageRef = CGImageCreateWithImageInRect([image CGImage], CGRectMake((image.size.height-dimension)/2, 0, dimension, dimension));
元の画像を使用している場合、この時点では次のようになります。
これは問題なく、私が期待していることです。これを整理する回転アルゴリズムがここには示されていません。
フィルタリングされた画像を使用している場合は、次のようになります。
...正方形ではなく、奇妙なことにズームインしました。 したがって、これが問題の原因であるように思われます。これらのフィルタリングされた画像の動作が異なる理由はわかりません。
}
else
{
dimension = image.size.height;
imageRef = CGImageCreateWithImageInRect([image CGImage], CGRectMake((image.size.width-dimension)/2, 0, dimension, dimension));
}
CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef);
CGColorSpaceRef colorSpaceInfo = CGImageGetColorSpace(imageRef);
CGContextRef bitmap;
bitmap = CGBitmapContextCreate(NULL, dimension, dimension, CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo);
私の問題は、その最後の行であるCGBitmapContextCreateで、次のエラーが発生することがあることです。
<Error>: CGBitmapContextCreate: invalid data bytes/row: should be at least 7744 for 8 integer bits/component, 3 components, kCGImageAlphaNoneSkipLast.
奇妙なことに、通常、これは発生しません-これまでのところ、元の画像の高さが幅よりも大きく、Camera+と呼ばれる別のアプリによってフィルタリングされた場合にのみこのエラーが発生しました...以前とまったく同じ写真フィルタリングは問題なく、フィルタリングされた風景写真も問題ないようです。
誰かが私をここに案内したり、実際に何が起こっているのかを説明するのを手伝ってもらえますか?エラーメッセージから、CGImageGetBytesPerRow(imageRef)を7744より大きい任意の数値に置き換えると、エラーは発生しなくなることを十分に理解していますが、このCGImageについては、実際にどのような影響があるのかを十分に理解していません。何でも、そしてそれは実際の解決策の多くのように私には思えません。このコードは、私がWebで見た他のトリミングの例に基づいているため、これらのビットマップ関数についての私の理解は限られています。
どんな考えでも大歓迎です!
編集
私はSOでこの質問を見つけました:このCGBitmapContextCreateで、bytesPerRow0はなぜですか?そして、bytesPerRowパラメーターを0に設定するように促されました。これによりエラーは解消されますが、このエラーが以前に発生したときと同じ状況では、トリミングルーチンが正しく機能しません。これには特別な人が答える必要があるかもしれませんが、ポートレート指向のカメラ+フィルタリングされた写真がこのコードによってどういうわけか異なって扱われる理由を推測するのに十分な画像フィルタリングについて知っている人はいますか?質問が少し変わったのでタイトルを更新しました。
EDIT2
上記のコードにサンプル画像を追加しました。最終的に、必要な回転を行った後、最終的にトリミングされた画像は次のようになります。
元の画像で:-完璧です!
フィルタリングされた画像で:-ひどい!
これらの最終的な、おそらくトリミングされた画像を作成するために使用されるコードは次のとおりです。
CGContextDrawImage(bitmap, CGRectMake(0, 0, dimension, dimension), imageRef);
CGImageRef ref = CGBitmapContextCreateImage(bitmap);
image = [UIImage imageWithCGImage:ref];
UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);