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

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

【问题讨论】:

    标签: iphone objective-c ios image-clipping


    【解决方案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 相机拍摄时)进行这项工作吗?
    猜你喜欢
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 2015-02-02
    相关资源
    最近更新 更多