1

私はカメラ関連のアプリに取り組んでいます.ここではカメラから画像を取得しており、それをトリミングして後で画像ビューに修正する必要があります.画像をトリミングするためにOpenGLを使用しています.私の問題は、画像をトリミングした後、180しかし、これは常に起こっているわけではありません。元の画像自体を取得していることもあります。

-(void)showResult
{
    NSLog(@"showResult called" );

    UIImage *imageCrop;
    float scaleCrop;
    if (_sourceImage.size.width >= IMAGEWIDTH)
    {
        scaleCrop = IMAGEWIDTH / _sourceImage.size.width;
        imageCrop = [ImageCropViewController scaleImage:_sourceImage with:CGSizeMake(_sourceImage.size.width*scaleCrop, _sourceImage.size.height*scaleCrop)];
    }
    else
    {
        scaleCrop = 1;
        imageCrop = _sourceImage;
    }


    float scale = _sourceImage.size.width / resizeImage.size.width * 2;
    IplImage *iplImage = [ImageCropViewController CreateIplImageFromUIImage:imageCrop] ;
    Quadrilateral rectan;

    rectan.point[0].x = _touchLayer.rectan.pointA.x*scale*scaleCrop;
    rectan.point[0].y = _touchLayer.rectan.pointA.y*scale*scaleCrop;

    rectan.point[1].x = _touchLayer.rectan.pointB.x*scale*scaleCrop;
    rectan.point[1].y = _touchLayer.rectan.pointB.y*scale*scaleCrop;

    rectan.point[2].x = _touchLayer.rectan.pointC.x*scale*scaleCrop;
    rectan.point[2].y = _touchLayer.rectan.pointC.y*scale*scaleCrop;

    rectan.point[3].x = _touchLayer.rectan.pointD.x*scale*scaleCrop;
    rectan.point[3].y = _touchLayer.rectan.pointD.y*scale*scaleCrop;

    IplImage* dest = cropDoc2(iplImage,rectan);

    IplImage *image = cvCreateImage(cvGetSize(dest), IPL_DEPTH_8U, dest->nChannels);
    cvCvtColor(dest, image, CV_BGR2RGB);
    cvReleaseImage(&dest);

    tempImage = [ImageCropViewController UIImageFromIplImage:image withImageOrientation:_sourceImage.imageOrientation];
    [self crop:tempImage];
    cvReleaseImage(&image);

}

その後、以下のメソッドが呼び出されます

+ (UIImage *)UIImageFromIplImage:(IplImage *)image withImageOrientation:(UIImageOrientation)orientation
{
    NSLog(@"UIImageFromIplImage called" );

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    NSData *data = [NSData dataWithBytes:image->imageData length:image->imageSize];
    CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);
    CGImageRef imageRef = CGImageCreate(image->width, image->height, image->depth, image->depth * image->nChannels, image->widthStep, colorSpace, kCGImageAlphaNone|kCGBitmapByteOrderDefault, provider, NULL, false, kCGRenderingIntentDefault);
    UIImage *ret = [UIImage imageWithCGImage:imageRef scale:1 orientation:orientation];
    CGImageRelease(imageRef);
    CGDataProviderRelease(provider);
    CGColorSpaceRelease(colorSpace);
    return ret;
}

次に、要件に従って画像を回転させます

-(void)crop:(UIImage*)image

{
    NSLog(@"crop called" );
   //Adjust the image size, to scale the image to 1013 of width
    float targetWidth = 1009.0f;
    float scale = targetWidth / image.size.width;
    float scaleheight = image.size.height * scale;
   UIImage *imageToSent = [ImageCropViewController scaleImage:image     with:CGSizeMake(targetWidth, scaleheight)];


if([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeLeft)
{

    NSLog(@"###########Image orientation is UIInterfaceOrientationLandscapeLeft###########");
    imageToSent = [[UIImage alloc] initWithCGImage:imageToSent.CGImage scale:1.0f orientation:UIImageOrientationDown];

}

NSData *imageData = UIImageJPEGRepresentation(imageToSent,0.75);
NSDate *now = [NSDate dateWithTimeIntervalSinceNow:0];
NSString *caldate = [now description];
appDelegate.imagefilePath= [NSString stringWithFormat:@"%@/%@.jpg", DOCUMENTS_FOLDER,caldate];
[imageData writeToFile:appDelegate.imagefilePath atomically:YES];

appDelegate.cropimage=imageToSent;
}

どこが間違っていたのかわかりません。時間を無駄にしています。助けてください。

前もって感謝します

4

1 に答える 1

3

トリミング用のこのコードがあります。なぜopenGLを使用しているのですか?これが私のコードです。

- (UIImage *)cropImage : (UIImage*)myImage withRect:(CGRect)rect
{
      CGImageRef imageRef = CGImageCreateWithImageInRect([myImage CGImage], rect);
      UIImage *img = [UIImage imageWithCGImage:imageRef]; 
      CGImageRelease(imageRef);
      return img;
}

画像をトリミングしたいときはいつでも、このメソッドを呼び出すだけです。また、カメラまたはギャラリー (ネイティブ カメラ アプリから取得した画像) から画像を取得すると、回転した画像が取得されます。このコードを使用して、元の画像に戻します。

//----rotate image if picked from gallery or camera----//
- (UIImage *)scaleAndRotateImage:(UIImage *)image {

    NSLog(@"scaleAndRotateImage");
    static int kMaxResolution = 640; // this is the maximum resolution that you want to set for an image.

    CGImageRef imgRef = image.CGImage;
    CGFloat width = CGImageGetWidth(imgRef);
    CGFloat height = CGImageGetHeight(imgRef);

    CGAffineTransform transform = CGAffineTransformIdentity;
    CGRect bounds = CGRectMake(0, 0, width, height);
    if (width > kMaxResolution || height > kMaxResolution) {
        CGFloat ratio = width/height;
        if (ratio > 1) {
            bounds.size.width = kMaxResolution;
            bounds.size.height = bounds.size.width / ratio;
        } else {
            bounds.size.height = kMaxResolution;
            bounds.size.width = bounds.size.height * ratio;
        }
    }

    CGFloat scaleRatio = bounds.size.width / width;
    CGSize imageSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef));
    CGFloat boundHeight;
    UIImageOrientation orient = image.imageOrientation;
    switch(orient) {
        case UIImageOrientationUp:
            transform = CGAffineTransformIdentity;
            break;
        case UIImageOrientationUpMirrored:
            transform = CGAffineTransformMakeTranslation(imageSize.width, 0.0);
            transform = CGAffineTransformScale(transform, -1.0, 1.0);
            break;
        case UIImageOrientationDown:
            transform = CGAffineTransformMakeTranslation(imageSize.width, imageSize.height);
            transform = CGAffineTransformRotate(transform, M_PI);
            break;
        case UIImageOrientationDownMirrored:
            transform = CGAffineTransformMakeTranslation(0.0, imageSize.height);
            transform = CGAffineTransformScale(transform, 1.0, -1.0);
            break;
        case UIImageOrientationLeftMirrored:
            boundHeight = bounds.size.height;
            bounds.size.height = bounds.size.width;
            bounds.size.width = boundHeight;
            transform = CGAffineTransformMakeTranslation(imageSize.height, imageSize.width);
            transform = CGAffineTransformScale(transform, -1.0, 1.0);
            transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);
            break;
        case UIImageOrientationLeft:
            boundHeight = bounds.size.height;
            bounds.size.height = bounds.size.width;
            bounds.size.width = boundHeight;
            transform = CGAffineTransformMakeTranslation(0.0, imageSize.width);
            transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);
            break;
        case UIImageOrientationRightMirrored:
            boundHeight = bounds.size.height;
            bounds.size.height = bounds.size.width;
            bounds.size.width = boundHeight;
            transform = CGAffineTransformMakeScale(-1.0, 1.0);
            transform = CGAffineTransformRotate(transform, M_PI / 2.0);
            break;
        case UIImageOrientationRight:
            boundHeight = bounds.size.height;
            bounds.size.height = bounds.size.width;
            bounds.size.width = boundHeight;
            transform = CGAffineTransformMakeTranslation(imageSize.height, 0.0);
            transform = CGAffineTransformRotate(transform, M_PI / 2.0);
            break;
        default:
            [NSException raise:NSInternalInconsistencyException 
                        format:@"Invalid image orientation"];
    }

    UIGraphicsBeginImageContext(bounds.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    if (orient == UIImageOrientationRight || orient == UIImageOrientationLeft) {
        CGContextScaleCTM(context, -scaleRatio, scaleRatio);
        CGContextTranslateCTM(context, -height, 0);
    } else {
        CGContextScaleCTM(context, scaleRatio, -scaleRatio);
        CGContextTranslateCTM(context, 0, -height);
    }
    CGContextConcatCTM(context, transform);
    CGContextDrawImage(UIGraphicsGetCurrentContext(), 
                       CGRectMake(0, 0, width, height), imgRef); 
    UIImage *returnImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return returnImage;
}

私が助けてくれることを願っています。

于 2013-04-12T07:37:25.360 に答える