如何在 iPhone 中裁剪图像

Posted

技术标签:

【中文标题】如何在 iPhone 中裁剪图像【英文标题】:How to crop the image in iPhone 【发布时间】:2011-12-18 12:57:55 【问题描述】:

我想做与this 问题中提出的相同的事情。 在我的应用程序中,我想像在 Facebook 中进行图像裁剪一样裁剪图像,任何人都可以通过优秀教程的链接或任何示例代码来指导我。我提供的链接将完全描述我的要求。

【问题讨论】:

【参考方案1】:

您可以创建具有任何属性的新图像。这是我的功能,女巫这样做。您只需要使用自己的新图像参数即可。在我的情况下,图像没有被裁剪,我只是做了一些效果,将像素从原始位置移动到另一个位置。但是如果你用另一个高度和宽度初始化新图像,你可以从你需要的旧图像的任何像素范围复制到新图像:

-(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;

【讨论】:

感谢 SentineL 的回复,但我想你没有收到我的问题,我想裁剪我正在使用这行代码 CGRect cropRect = CGRectMake(100, 100, 200, 200); CGImageRef imageRef = CGImageCreateWithImageInRect(ImageREF.CGImage, cropRect); 做的图像,但这种裁剪是硬编码的,我想要用户调整此link中显示的图像链接的矩形@ 所以...你只是想制作用户界面,选择矩形来裁剪图像?这很简单:只需实现触摸whatch 就可以了。 4 个 alpha 0.7 的空白条将静音区域将被裁剪。您可以处理 2 次触摸:根据那里的坐标,并且知道它们在 ractangle 对角线的不同侧,您将轻松计算 4 个暗条的大小。只是在每一步都改变它。或者,单点触控:您将需要 4 个空格(那个蓝色圆圈)。跟踪触摸并移动到移动 tham 感谢 SentineL 的回复以及您指导我的方式:)【参考方案2】:

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);

【讨论】:

这里的 imageForcropping 是您要裁剪的图像..以及您要裁剪的部分的裁剪图像.. 知道如何在图像旋转时(即从 iPhone 相机拍摄时)进行这项工作吗?

以上是关于如何在 iPhone 中裁剪图像的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iphone sdk 中裁剪图像圈

如何在 iPhone 应用程序中执行图像编辑?

如何在 iOS 中将图像裁剪为多边形?

从 iPhone 的照片库中调整方形裁剪图像的正确方法而不会失真

如何以编程方式在 iPhone 相机中显示图像编辑控件

在 iPhone 中裁剪图像的某些部分(以某种形状)