绘制直方图在iPhone中需要更多的准确性



ios uiimage (1)

我从Github上取下你的样本,发现你的ClsDraw中的drawRect:方法正在绘制一个像素宽的线。 笔画以线为中心,宽度为1,笔画被分成半像素,引入反锯齿。

我将水平偏移移动了半个像素,渲染看起来很清晰。 我没有弄乱垂直偏移,但为了使它们变得锋利,你需要将它们四舍五入,然后将它们移到半像素偏移处。 我只做了以下改变:

#define OFFSET_X 0.5

- (void)drawRect:(CGRect)rect
{   
  CGContextRef ctx = UIGraphicsGetCurrentContext();
  if ([arrPoints count] > 0)
  {
    CGContextSetLineWidth(ctx, 1);
    CGContextSetStrokeColorWithColor(ctx, graphColor.CGColor);
    CGContextSetAlpha(ctx, 0.8);
    ClsDrawPoint *objPoint;
    CGContextBeginPath(ctx);

    for (int i = 0 ; i < [arrPoints count] ; i++)
    {
      objPoint = [arrPoints objectAtIndex:i];
      CGPoint adjustedPoint = CGPointMake(objPoint.x+OFFSET_X, objPoint.y);
      CGContextMoveToPoint(ctx, adjustedPoint.x, 0);
      CGContextSetLineCap(ctx, kCGLineCapRound);
      CGContextSetLineJoin(ctx, kCGLineJoinRound);
      CGContextAddLineToPoint(ctx, adjustedPoint.x, adjustedPoint.y);
      CGContextMoveToPoint(ctx, adjustedPoint.x, adjustedPoint.y);
      CGContextStrokePath(ctx);
    }
  }
}

注意新的OFFSET_XOFFSET_X的介绍。

除了计划添加一些额外的行为或属性外,还可以考虑使用填充到NSValue实例中的CGPoint来代替您的自定义类ClsDrawPoint 。 更多细节在这里

我正在一个应用程序中,我需要绘制任何输入图像的直方图。 我可以成功绘制直方图,但不像在Mac OS中的PREVIEW中那么尖锐。

由于代码太大,我已经上传到GitHub 点击这里下载

RGB值被读入

  -(void)readImage:(UIImage*)image
{
    CGImageRef imageRef = [image CGImage];
    NSUInteger width = CGImageGetWidth(imageRef);
    NSUInteger height = CGImageGetHeight(imageRef);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    unsigned char *rawData = (unsigned char*) calloc(height * width * 4, sizeof(unsigned char));
    NSUInteger bytesPerPixel = 4;
    NSUInteger bytesPerRow = bytesPerPixel * width;
    NSUInteger bitsPerComponent = 8;
    CGContextRef context = CGBitmapContextCreate(rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
    CGColorSpaceRelease(colorSpace);
    CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
    CGContextRelease(context);

    for (int yy=0;yy<height; yy++)
    {
        for (int xx=0; xx<width; xx++)
        {
            // Now your rawData contains the image data in the RGBA8888 pixel format.
            int byteIndex = (bytesPerRow * yy) + xx * bytesPerPixel;
            for (int ii = 0 ; ii < 1 ; ++ii)
            {
                CGFloat red   = (rawData[byteIndex]     * 1.0) ;
                CGFloat green = (rawData[byteIndex + 1] * 1.0) ;
                CGFloat blue  = (rawData[byteIndex + 2] * 1.0) ;
                // CGFloat alpha = (rawData[byteIndex + 3] * 1.0) / 255.0;
                byteIndex += 4;

                // TYPE CASTING ABOVE FLOAT VALUES TO THAT THEY CAN BE MATCHED WITH ARRAY'S INDEX.

                int redValue = (int)red;
                int greenValue = (int)green;
                int blueValue = (int)blue;


                // THESE COUNTERS COUNT " TOTAL NUMBER OF PIXELS " FOR THAT  Red , Green or Blue Value IN ENTIRE IMAGE.

                fltR[redValue]++;
                fltG[greenValue]++;
                fltB[blueValue]++;                
            }
        }
    }
    [self makeArrays];
    free(rawData);
}

我存储在c数组变量,fltR,fltG,fltB的值。

我有一个类ClsDrawPoint它有成员

@property CGFloat x;
@property CGFloat y;

然后准备一个包含ClsDrawPoint的对象的数组,其中fltR []的索引为X值,该索引的值为Y值。

数组被准备好并且绘制图形

-(void)makeArrays

方法

你可能会看到结果

目前它不像在预览在mac中的相同的图像准确。 您可以在Mac中的PREVIEW应用程序中打开图像,然后在“工具”>“调整颜色”中,您将能够看到该图像的直方图。 我想如果我的图表是accrate,它会更清晰。 请检查我的代码,并建议我,如果你发现无论如何,使其更加准确。





histogram