Как обрезать изображение в iPhone

Я хочу сделать то же самое, что и в этот вопрос. В моем приложении я хочу обрезать изображение так же, как мы обрезаем изображение в FaceBook, может ли кто-нибудь дать мне ссылку на хороший учебник или любой пример кода. Ссылка, которую я предоставил, полностью описывает мое требование.


person Muhammad Saqib    schedule 31.10.2011    source источник


Ответы (2)


Вы можете создать новое изображение с любыми свойствами. Вот моя функция, сделай это. вам просто нужно использовать свои собственные параметры нового изображения. В моем случае изображение не обрезается, я просто делаю эффект, перемещая пиксели из исходного места в другое. Но если вы инициализируете новое изображение с другой высотой и шириной, вы можете просто скопировать из любого нужного вам диапазона пикселей старого изображения в новое:

-(UIImage *)Color:(UIImage *)img
{
    int R;
    float m_width = img.size.width;
    float m_height = img.size.height;
    if (m_width>m_height) R = m_height*0.9;
    else R = m_width*0.9;
    int m_wint = (int)m_width;      //later,  we will need this parameters in float and int. you may just use "(int)" and "(float)" before variables later, and do not implement another ones
    int m_hint = (int)m_height;

    CGRect imageRect;
    //cheking image orientation. we will work with image pixel-by-pixel, so we need to make top side at the top.
    if(img.imageOrientation==UIImageOrientationUp 
       || img.imageOrientation==UIImageOrientationDown) 
    {
        imageRect = CGRectMake(0, 0, m_wint, m_hint); 
    }
    else 
    {
        imageRect = CGRectMake(0, 0, m_hint, m_wint); 
    }
    uint32_t *rgbImage = (uint32_t *) malloc(m_wint * m_hint * sizeof(uint32_t));
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(rgbImage, m_wint, m_hint, 8, m_wint *sizeof(uint32_t), colorSpace,   kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipLast);
    CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
    CGContextSetShouldAntialias(context, NO);
    CGContextTranslateCTM(context, 0, m_hint);
    CGContextScaleCTM(context, 1.0, -1.0);
    switch (img.imageOrientation) {
        case UIImageOrientationRight:
        {
            CGContextRotateCTM(context, M_PI / 2);
            CGContextTranslateCTM(context, 0, -m_wint);            
        }break;
        case UIImageOrientationLeft:
        {
            CGContextRotateCTM(context, - M_PI / 2);
            CGContextTranslateCTM(context, -m_hint, 0);            
        }break;
        case UIImageOrientationUp:
        {
            CGContextTranslateCTM(context, m_wint, m_hint);
            CGContextRotateCTM(context, M_PI);
        }
        default:
            break;
    }

    CGContextDrawImage(context, imageRect, img.CGImage);
    CGContextRelease(context);
    CGColorSpaceRelease(colorSpace);

    //here is new image. you can change m_wint and m_hint as you whant
    uint8_t *result = (uint8_t *) calloc(m_wint * m_hint * sizeof(uint32_t), 1);
    for(int y = 0; y < m_hint; y++) //new m_hint here
    {
        float fy=y;
        double yy =    (m_height*(  asinf(m_height/(2*R))-asin(((m_height/2)-fy)/R)   )) /
        (2*asin(m_height/(2*R))); // (xx, yy) - coordinates of pixel of OLD image
        for(int x =  0; x < m_wint; x++) //new m_wint here
        {
            float fx=x;
            double xx =    (m_width*(  asin(m_width/(2*R))-asin(((m_width/2)-fx)/R)   )) /
            (2*asin(m_width/(2*R)));
            uint32_t rgbPixel=rgbImage[(int)yy * m_wint + (int)xx];
            int intRedSource = (rgbPixel>>24)&255;
            int intGreenSource = (rgbPixel>>16)&255;
            int intBlueSource = (rgbPixel>>8)&255;
            result[(y * (int)m_wint + x) * 4] = 0;
            result[(y * (int)m_wint + x) * 4 + 1] = intBlueSource;
            result[(y * (int)m_wint + x) * 4 + 2] = intGreenSource;
            result[(y * (int)m_wint + x) * 4 + 3] = intRedSource;

        }
    }

    free(rgbImage);

    colorSpace = CGColorSpaceCreateDeviceRGB();
    context = CGBitmapContextCreate(result, m_wint, m_hint, 8, m_wint * sizeof(uint32_t), colorSpace,   kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipLast  ); //new m_wint and m_hint as well


    CGImageRef image1 = CGBitmapContextCreateImage(context);
    CGContextRelease(context);
    CGColorSpaceRelease(colorSpace);
    UIImage *resultUIImage = [UIImage imageWithCGImage:image1];
    CGImageRelease(image1);


    @try {
        free(result);
    }
    @catch (NSException * e) {
        NSLog(@"proc. Exception: %@", e);
    }

    return resultUIImage;
}
person SentineL    schedule 31.10.2011
comment
Спасибо SentineL за ваш ответ, но я думаю, что вы не задали мне вопрос, я хочу обрезать свое изображение, что я делаю с помощью этих строк кода CGRect cropRect = CGRectMake(100, 100, 200, 200); CGImageRef imageRef = CGImageCreateWithImageInRect(ImageREF.CGImage, cropRect);, но эта обрезка жестко запрограммирована, я хочу, чтобы пользователь настроил Rect для показанной ссылки на изображение по этой ссылке - person Muhammad Saqib; 31.10.2011
comment
Итак ... вы просто хотите сделать пользовательский интерфейс, чтобы выбрать прямоугольник для обрезки изображения? Это легко: просто реализуйте прикосновения к тому, что там движется. 4 черные полосы с альфа-каналом 0,7 отключат звук области, которая будет обрезана. Вы можете обрабатывать 2 касания: по их координатам, и зная, что они находятся по разные стороны диагонали прямоугольника, вы легко вычислите размеры 4 темных полос. просто меняйте их на каждом шагу. или одним касанием: вам понадобится 4 пробела (этот синий круг). Отслеживайте касания и двигайтесь, чтобы переместить их - person SentineL; 31.10.2011
comment
Спасибо, SentineL, за ваш ответ и за то, как вы меня ведете :) - person Muhammad Saqib; 01.11.2011

CGRect rectImage = CGRectMake(p1.x,p1.y, p2.x - p1.x, p4.y - p1.y);

//Create bitmap image from original image data,
//using rectangle to specify desired crop area

CGImageRef imageRef = CGImageCreateWithImageInRect([imageForCropping CGImage], rectImage); 
UIImage *croppedImage = [UIImage imageWithCGImage:imageRef]; 
imageView1 = [[UIImageView alloc] initWithFrame:CGRectMake(p1.x, p1.y,p2.x-p1.x p4.y-p1.y)];
imageView1.image = croppedImage;
[self.view addSubview:imageView1];
CGImageRelease(imageRef);
person Community    schedule 16.05.2012
comment
здесь imageForcropping - это изображение, которое вы хотите обрезать. И обрезанное изображение, часть которого вы хотите обрезать.. - person ; 16.05.2012
comment
есть идеи, как заставить это работать, когда изображение вращается (т.е. когда оно снято с камеры iphone)? - person Evan Layman; 09.12.2012