Resize and crop images before displaying in UITableViewCells

后端 未结 2 1591
鱼传尺愫
鱼传尺愫 2021-02-04 22:49

i have an UITableView in my app and i have to load some images that have a fixed width but different heights. I download the images async using an NSOperationQueue and for resiz

2条回答
  •  北恋
    北恋 (楼主)
    2021-02-04 23:27

    Try the following code. The createImage:image:width:height method requires a source CGImageRef and the new width and height of the final UIImage that will be returned. When using as source an UIImage, you can obtain the corresponding CGImageRef as follows:

    UIImage *sourceImage;
    CGImageRef *sourceRef = [sourceImage CGImage];
    
            // Draw the image into a pixelsWide x pixelsHigh bitmap and use that bitmap to 
            // create a new UIImage 
            - (UIImage *) createImage: (CGImageRef) image width: (int) pixelWidth height: (int) pixelHeight
            { 
                // Set the size of the output image 
                CGRect aRect = CGRectMake(0.0f, 0.0f, pixelWidth, pixelHeight); 
                // Create a bitmap context to store the new thumbnail 
                CGContextRef context = MyCreateBitmapContext(pixelWidth, pixelHeight); 
                // Clear the context and draw the image into the rectangle 
                CGContextClearRect(context, aRect); 
                CGContextDrawImage(context, aRect, image); 
                // Return a UIImage populated with the new resized image 
                CGImageRef myRef = CGBitmapContextCreateImage (context); 
    
                UIImage *img = [UIImage imageWithCGImage:myRef];
    
                free(CGBitmapContextGetData(context)); 
                CGContextRelease(context);
                CGImageRelease(myRef);
    
                return img; 
            } 
    
    
    
            // MyCreateBitmapContext: Source based on Apple Sample Code
            CGContextRef MyCreateBitmapContext (int pixelsWide,
                                                int pixelsHigh)
            {
                CGContextRef    context = NULL;
                CGColorSpaceRef colorSpace;
                void *          bitmapData;
                int             bitmapByteCount;
                int             bitmapBytesPerRow;
    
                bitmapBytesPerRow   = (pixelsWide * 4);
                bitmapByteCount     = (bitmapBytesPerRow * pixelsHigh);
    
                colorSpace = CGColorSpaceCreateDeviceRGB();
                bitmapData = malloc( bitmapByteCount );
                if (bitmapData == NULL)
                {
                    fprintf (stderr, "Memory not allocated!");
                    CGColorSpaceRelease( colorSpace );
                    return NULL;
                }
                context = CGBitmapContextCreate (bitmapData,
                                                 pixelsWide,
                                                 pixelsHigh,
                                                 8,
                                                 bitmapBytesPerRow,
                                                 colorSpace,
                                                 kCGImageAlphaPremultipliedLast);
                if (context== NULL)
                {
                    free (bitmapData);
                    CGColorSpaceRelease( colorSpace );
                    fprintf (stderr, "Context not created!");
                    return NULL;
                }
                CGColorSpaceRelease( colorSpace );
    
                return context;
            }
    

提交回复
热议问题