• 从图片中的一点取色


     
     
    最近看这个比较多人用到,以前有使用过,现在,粘过来给大伙看看.
    注意:UIImageView的大小只能跟图片一样大.要不然取色不对.
     

    - (UIColor *) getPixelColorAtLocation:(CGPoint)point {

            UIColor* color = nil;

            CGImageRef inImage = self.image.CGImage;

            // Create off screen bitmap context to draw the image into. Format ARGB is 4 bytes for each pixel: Alpa, Red, Green, Blue

            CGContextRef cgctx = [self createARGBBitmapContextFromImage:inImage];

            if (cgctx == NULL) {

                    return nil; /* error */ 

            }

        size_t w = CGImageGetWidth(inImage);

            size_t h = CGImageGetHeight(inImage);

            CGRect rect = {{0,0},{w,h}}; 

            // 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(cgctx, rect, inImage); 

            // Now we can get a pointer to the image data associated with the bitmap

            // context.

            unsigned char* data = CGBitmapContextGetData (cgctx);

            if (data != NULL) {

                    //offset locates the pixel in the data from x,y. 

                    //4 for 4 bytes of data per pixel, w is width of one row of data.

                    int offset = 4*((w*round(point.y))+round(point.x));

                    int alpha =  data[offset]; 

                    int red = data[offset+1]; 

                    int green = data[offset+2]; 

                    int blue = data[offset+3]; 

                    //NSLog(@"offset: %i colors: RGB A %i %i %i  %i",offset,red,green,blue,alpha);

                    color = [UIColor colorWithRed:(red/255.0f) green:(green/255.0f) blue:(blue/255.0f) alpha:(alpha/255.0f)];

            }

            // When finished, release the context

            CGContextRelease(cgctx); 

            // Free image data memory for the context

            if (data) { free(data); }

            return color;

    }

    - (CGContextRef) createARGBBitmapContextFromImage:(CGImageRef) inImage {

            CGContextRef    context = NULL;

            CGColorSpaceRef colorSpace;

            void *          bitmapData;

            int             bitmapByteCount;

            int             bitmapBytesPerRow;

            // Get image width, height. We'll use the entire image.

            size_t pixelsWide = CGImageGetWidth(inImage);

            size_t pixelsHigh = CGImageGetHeight(inImage);

            // 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   = (pixelsWide * 4);

            bitmapByteCount     = (bitmapBytesPerRow * pixelsHigh);

            // Use the generic RGB color space.

            colorSpace = CGColorSpaceCreateDeviceRGB();

            if (colorSpace == NULL)

            {

                    fprintf(stderr, "Error allocating color space\n");

                    return NULL;

            }

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

            {

                    fprintf (stderr, "Memory not allocated!");

                    CGColorSpaceRelease( colorSpace );

                    return NULL;

            }

            // 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.

            context = CGBitmapContextCreate (bitmapData,

                                                                             pixelsWide,

                                                                             pixelsHigh,

                                                                             8,      // bits per component

                                                                             bitmapBytesPerRow,

                                                                             colorSpace,

                                                                             kCGImageAlphaPremultipliedFirst);

            if (context == NULL)

            {

                    free (bitmapData);

    fprintf (stderr, "Context not created!");

            }

            // Make sure and release colorspace before returning

            CGColorSpaceRelease( colorSpace );

            return context;

    }

     
  • 相关阅读:
    爬虫笔记之JS检测浏览器开发者工具是否打开
    上海租房@8群
    在Windows中玩转Docker Toolbox(镜像加速)
    Docker 清理命令 删除所有的镜像和容器
    修改docker安装的machine位置
    Sass @mixin 与 @include
    webpack之SourceMap
    c#中Indexof()和Split()的用法
    《MVC+EF》——用DBFirst创建ADO.NET实体数据模型和对象关系映射
    sql server 用户'sa'登录失败(错误18456)
  • 原文地址:https://www.cnblogs.com/daguo/p/2619453.html
Copyright © 2020-2023  润新知