как я могу создать UIImage из двух изображений: изображения и границы

Я разрабатываю приложение для iphone, мне нужно манипулировать изображением во время выполнения, чтобы я мог дать ему границу изображения.

Мне нужно объединить два UIImage, один как границу или фоновое изображение, а другой UIImage будет находиться внутри первого, так как лучше всего это сделать?

Я читал о некоторых функциях, таких как UIGraphicsGetCurrentContext (), но кажется, что это нужно делать в основном потоке, и мне нужен более легкий код, потому что мне нужно вызывать его несколько раз.

Благодарность


person Community    schedule 04.03.2011    source источник


Ответы (4)


Манипуляции с изображениями

Вот пример (не тестировался, просто чтобы показать вам идею):

-(UIImage *)imageWithImage:(UIImage *)image borderImage:(UIImage *)borderImage covertToSize:(CGSize)size {
    UIGraphicsBeginImageContext(size);
    [borderImage drawInRect:CGRectMake( 0, 0, size.width, size.height )];
    [image drawInRect:CGRectMake( 10, 10, size.width - 20, size.height - 20)];
    UIImage *destImage = UIGraphicsGetImageFromCurrentImageContext();    
    UIGraphicsEndImageContext();
    return destImage;
}

Он рисует фоновое изображение, чем ваше изображение, которое будет намного меньше. Вы можете использовать это, если действительно хотите манипулировать изображением, а ваш borderImage не прозрачен. Если он прозрачный, вы можете нарисовать его поверх изображения (поменяйте местами строки с вызовами drawRect:).

Только для медийной рекламы

Или, если вы хотите это только для целей отображения, вы можете наложить представления или использовать Quartz и установить какую-то границу через CALayer.

self.imageView.layer.cornerRadius = 3.0;
self.imageView.layer.masksToBounds = YES;
self.imageView.layer.borderColor = [UIColor blackColor].CGColor;
self.imageView.layer.borderWidth = 1.0;
person zrzka    schedule 04.03.2011

Если ваша граница прозрачна, вы можете просто создать UIImageView с вашим изображением в нем и еще UIImageView с вашей рамкой в ​​нем, а затем добавить их в качестве подвидов в представление с границей поверх изображения.

person Jasarien    schedule 04.03.2011

Почему бы вам просто не сделать второй UIImageView подпредставлением первого (Border imageView)?

person Bourne    schedule 04.03.2011

Это фрагмент кода, который я нашел давно, и использую в своем расширении UIView. Не уверен, кому это заслуга, но вот она:

- (UIImage *)overlayWithImage:(UIImage *)image2 {

    UIImage *image1 = self;
    CGRect drawRect = CGRectMake(0.0, 0.0, image1.size.width, image1.size.height);

    // Create the bitmap context
    CGContextRef    bitmapContext = NULL;
    void *          bitmapData;
    int             bitmapByteCount;
    int             bitmapBytesPerRow;
    CGSize          size = CGSizeMake(image1.size.width, image1.size.height);

    // Declare the number of bytes per row. Each pixel in the bitmap in this
    // example is represented by 4 bytes; 8 bits each of red, green, blue, and
    // alpha.

        bitmapBytesPerRow   = (size.width * 4);
        bitmapByteCount     = (bitmapBytesPerRow * size.height);

    // Allocate memory for image data. This is the destination in memory
    // where any drawing to the bitmap context will be rendered.

        bitmapData = malloc( bitmapByteCount );

        if (bitmapData == NULL) {

            return nil;
        }

// Create the bitmap context. We want pre-multiplied ARGB, 8-bits
// per component. Regardless of what the source image format is
// (CMYK, Grayscale, and so on) it will be converted over to the format
// specified here by CGBitmapContextCreate.

        bitmapContext = CGBitmapContextCreate (bitmapData, size.width, size.height,8,bitmapBytesPerRow,                 CGColorSpaceCreateDeviceRGB(),kCGImageAlphaNoneSkipFirst);

        if (bitmapContext == NULL)

// error creating context

             return nil;

// Draw the image to the bitmap context. Once we draw, the memory
// allocated for the context for rendering will then contain the
// raw image data in the specified color space.

        CGContextDrawImage(bitmapContext, drawRect, [image1 CGImage]);
    CGContextDrawImage(bitmapContext, drawRect, [image2 CGImage]);
    CGImageRef   img = CGBitmapContextCreateImage(bitmapContext);
    UIImage*     ui_img = [UIImage imageWithCGImage: img];

    CGImageRelease(img);
    CGContextRelease(bitmapContext);
    free(bitmapData);

    return ui_img;
}
  • Я использую это в фоновом потоке без осложнений.
person Schoob    schedule 04.03.2011