Dibujo de histogtwig necesita más precisión en iPhone

Estoy trabajando en una aplicación en la que necesito dibujar un histogtwig de cualquier image ingresada. Puedo dibujar Histogram con éxito, pero no es tan nítida como está en PREVIEW en Mac OS.

Como el código es demasiado grande, lo he cargado en GitHub. Haga clic aquí para download

Los valores RGB se leen en

-(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 networking = (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 networkingValue = (int)networking; 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[networkingValue]++; fltG[greenValue]++; fltB[blueValue]++; } } } [self makeArrays]; free(rawData); } 

Almacené valores en c variables de matriz, fltR, fltG, fltB.

Tengo una class ClsDrawPoint que tiene miembros

 @property CGFloat x; @property CGFloat y; 

Luego preparó una matriz que contiene objects de ClsDrawPoint que tienen el índice de fltR [] como valor X y valor para ese índice como valor Y.

La matriz se prepara y el gráfico se dibuja en

 -(void)makeArrays 

método

Puede ver el resultado

introduzca la descripción de la imagen aquí

Actualmente no es tan precisa como en PREVIEW en mac para la misma image. Puede abrir una image en la aplicación PREVIEW en Mac y en Herramientas> Ajustar color, podrá ver el histogtwig de esa image. Creo que si mi gráfico se acumula, será más nítido. Por favor revisa mi código y me sugieres si encuentras de todos modos para hacerlo más preciso.

Saqué su muestra de Github y descubrí que su método drawRect: en ClsDraw dibuja líneas que tienen un píxel de ancho. Los trazos se centran en la línea, y con un ancho de 1, la trazo se divide en medio píxeles que introduce el suavizado.

Moví sus desplazamientos horizontales en un medio píxel y la reproducción se ve nítida. No me metí con los desplazamientos verticales, pero para hacerlos nítidos necesitarías networkingondearlos y luego moverlos a una compensación de medio píxel también. Solo hice el siguiente cambio:

 #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); } } } 

Observe la nueva OFFSET_X y la introducción de adjustedPoint .

También puede considerar utilizar un CGPoint relleno en una instancia de NSValue para sus puntos en lugar de su class personalizada ClsDrawPoint , a less que planee agregar algún comportamiento o properties adicionales. Más detalles disponibles aquí .

    Intereting Posts