39 votes

Comment recadrer le UIImage?

Je développe une application dans laquelle je traite l'image à l'aide de ses pixels, mais cela prend beaucoup de temps. Par conséquent, je veux recadrer UIImage (seule la partie centrale de l’image, c’est-à-dire supprimer / rogner la partie bordée de l’image) .J'ai le code de développement,

 - (NSInteger) processImage1: (UIImage*) image
{

 CGFloat width = image.size.width;
 CGFloat height = image.size.height;
 struct pixel* pixels = (struct pixel*) calloc(1, image.size.width * image.size.height * sizeof(struct pixel));
 if (pixels != nil)
 {
  // Create a new bitmap
  CGContextRef context = CGBitmapContextCreate(
              (void*) pixels,
              image.size.width,
              image.size.height,
              8,
              image.size.width * 4,
              CGImageGetColorSpace(image.CGImage),
              kCGImageAlphaPremultipliedLast
              );
  if (context != NULL)
  {
   // Draw the image in the bitmap
   CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, image.size.width, image.size.height), image.CGImage);
   NSUInteger numberOfPixels = image.size.width * image.size.height;

   NSMutableArray *numberOfPixelsArray = [[[NSMutableArray alloc] initWithCapacity:numberOfPixelsArray] autorelease];
}
 

Comment je prends (recadrage extérieur bordé) la partie centrale de UIImage ?????????

82voto

mihir mehta Points 8182

Essayez quelque chose comme ça:

 CGImageRef imageRef = CGImageCreateWithImageInRect([largeImage CGImage], cropRect);
image = [UIImage imageWithCGImage:imageRef]; 
CGImageRelease(imageRef);
 

Remarque: cropRect est un rectangle plus petit avec la partie centrale de l'image ...

40voto

M-V Points 1801

Je cherchais un moyen d'obtenir un arbitraire rectangulaire culture (ie., sous-image) d'une UIImage.

La plupart des solutions que j'ai essayé ne fonctionnent pas si l'orientation de l'image est rien mais UIImageOrientationUp.

Par exemple:

http://www.hive05.com/2008/11/crop-an-image-using-the-iphone-sdk/

En règle générale, si vous utilisez votre iPhone appareil photo, vous aurez d'autres orientations comme UIImageOrientationLeft, et vous n'obtiendrez pas une bonne culture avec la ci-dessus. C'est à cause de l'utilisation de CGImageRef/CGContextDrawImage qui diffèrent dans le système de coordonnées à l'égard de UIImage.

Le code ci-dessous utilise l'INTERFACE utilisateur* méthodes (pas de CGImageRef), et j'ai testé avec haut/bas/gauche/droite orientée images, et il semble fonctionner à merveille.


// get sub image
- (UIImage*) getSubImageFrom: (UIImage*) img WithRect: (CGRect) rect {

    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();

    // translated rectangle for drawing sub image 
    CGRect drawRect = CGRectMake(-rect.origin.x, -rect.origin.y, img.size.width, img.size.height);

    // clip to the bounds of the image context
    // not strictly necessary as it will get clipped anyway?
    CGContextClipToRect(context, CGRectMake(0, 0, rect.size.width, rect.size.height));

    // draw image
    [img drawInRect:drawRect];

    // grab image
    UIImage* subImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return subImage;
}

2voto

Scott Lahteine Points 735

Il serait, en définitive, être plus rapide, avec beaucoup moins de la création de l'image du sprite atlas, si vous pouviez définir non seulement l'image pour une UIImageView, mais aussi le haut à gauche décalage à l'affichage à l'intérieur de cette UIImage. C'est peut-être possible. Il serait certainement éliminer beaucoup d'efforts!

Pendant ce temps, j'ai créé ces fonctions utiles dans une classe utilitaire que j'utilise dans mes applications. Il crée une UIImage de la partie d'un autre UIImage, avec des options de rotation, échelle, et de le retourner à l'aide de la norme UIImageOrientation valeurs à spécifier. Le pixel de mise à l'échelle est conservée à partir de l'image d'origine.

Mon application crée beaucoup de UIImages lors de l'initialisation, et cela prend nécessairement du temps. Mais certaines images ne sont pas nécessaires jusqu'à un certain onglet est sélectionné. Pour donner l'apparence de chargement plus rapide j'ai pu créer dans un thread donné naissance au démarrage, juste attendre jusqu'à ce que ça fait lorsque cet onglet est sélectionné.

Ce code est aussi publié sur le moyen le Plus efficace de tirer partie d'une image dans iOS

+ (UIImage*)imageByCropping:(UIImage *)imageToCrop toRect:(CGRect)aperture {
    return [ChordCalcController imageByCropping:imageToCrop toRect:aperture withOrientation:UIImageOrientationUp];
}

// Draw a full image into a crop-sized area and offset to produce a cropped, rotated image
+ (UIImage*)imageByCropping:(UIImage *)imageToCrop toRect:(CGRect)aperture withOrientation:(UIImageOrientation)orientation {

            // convert y coordinate to origin bottom-left
    CGFloat orgY = aperture.origin.y + aperture.size.height - imageToCrop.size.height,
            orgX = -aperture.origin.x,
            scaleX = 1.0,
            scaleY = 1.0,
            rot = 0.0;
    CGSize size;

    switch (orientation) {
        case UIImageOrientationRight:
        case UIImageOrientationRightMirrored:
        case UIImageOrientationLeft:
        case UIImageOrientationLeftMirrored:
            size = CGSizeMake(aperture.size.height, aperture.size.width);
            break;
        case UIImageOrientationDown:
        case UIImageOrientationDownMirrored:
        case UIImageOrientationUp:
        case UIImageOrientationUpMirrored:
            size = aperture.size;
            break;
        default:
            assert(NO);
            return nil;
    }


    switch (orientation) {
        case UIImageOrientationRight:
            rot = 1.0 * M_PI / 2.0;
            orgY -= aperture.size.height;
            break;
        case UIImageOrientationRightMirrored:
            rot = 1.0 * M_PI / 2.0;
            scaleY = -1.0;
            break;
        case UIImageOrientationDown:
            scaleX = scaleY = -1.0;
            orgX -= aperture.size.width;
            orgY -= aperture.size.height;
            break;
        case UIImageOrientationDownMirrored:
            orgY -= aperture.size.height;
            scaleY = -1.0;
            break;
        case UIImageOrientationLeft:
            rot = 3.0 * M_PI / 2.0;
            orgX -= aperture.size.height;
            break;
        case UIImageOrientationLeftMirrored:
            rot = 3.0 * M_PI / 2.0;
            orgY -= aperture.size.height;
            orgX -= aperture.size.width;
            scaleY = -1.0;
            break;
        case UIImageOrientationUp:
            break;
        case UIImageOrientationUpMirrored:
            orgX -= aperture.size.width;
            scaleX = -1.0;
            break;
    }

    // set the draw rect to pan the image to the right spot
    CGRect drawRect = CGRectMake(orgX, orgY, imageToCrop.size.width, imageToCrop.size.height);

    // create a context for the new image
    UIGraphicsBeginImageContextWithOptions(size, NO, imageToCrop.scale);
    CGContextRef gc = UIGraphicsGetCurrentContext();

    // apply rotation and scaling
    CGContextRotateCTM(gc, rot);
    CGContextScaleCTM(gc, scaleX, scaleY);

    // draw the image to our clipped context using the offset rect
    CGContextDrawImage(gc, drawRect, imageToCrop.CGImage);

    // pull the image from our cropped context
    UIImage *cropped = UIGraphicsGetImageFromCurrentImageContext();

    // pop the context to get back to the default
    UIGraphicsEndImageContext();

    // Note: this is autoreleased
    return cropped;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X