source: libpipi/trunk/pipi/analysis/histogram.c @ 3340

Last change on this file since 3340 was 3340, checked in by Sam Hocevar, 14 years ago

Rename pipi_getpixel into pipi_get_pixels.

File size: 4.2 KB
Line 
1/*
2 *  libpipi       Pathetic image processing interface library
3 *  Copyright (c) 2004-2008 Sam Hocevar <sam@zoy.org>
4 *                2008 Jean-Yves Lamoureux <jylam@lnxscene.org
5 *                All Rights Reserved
6 *
7 *  $Id$
8 *
9 *  This library is free software. It comes without any warranty, to
10 *  the extent permitted by applicable law. You can redistribute it
11 *  and/or modify it under the terms of the Do What The Fuck You Want
12 *  To Public License, Version 2, as published by Sam Hocevar. See
13 *  http://sam.zoy.org/wtfpl/COPYING for more details.
14 */
15
16/*
17 * histogram.c: histogram functions
18 */
19
20#include "config.h"
21
22#include <stdio.h>
23#include <stdlib.h>
24#include <string.h>
25
26#include "pipi.h"
27#include "pipi_internals.h"
28
29
30pipi_histogram_t* pipi_new_histogram(void)
31{
32    return malloc(sizeof(pipi_histogram_t));
33}
34
35
36int pipi_get_image_histogram(pipi_image_t *img, pipi_histogram_t*h, int flags)
37{
38    uint8_t  *data;
39    float n;
40    unsigned int max;
41    int i;
42
43    if(!h) return -1;
44
45    data = (uint8_t *)pipi_get_pixels(img, PIPI_PIXELS_RGBA_C)->pixels;
46    memset(h->a, 0, 256*(sizeof(unsigned int)));
47    memset(h->r, 0, 256*(sizeof(unsigned int)));
48    memset(h->g, 0, 256*(sizeof(unsigned int)));
49    memset(h->b, 0, 256*(sizeof(unsigned int)));
50    memset(h->y, 0, 256*(sizeof(unsigned int)));
51
52
53    for(i=0; i< img->w*img->h*4; i+=4)
54    {
55        if(flags&PIPI_COLOR_A)
56            h->a[data[i+3]]++;
57        if(flags&PIPI_COLOR_R)
58            h->r[data[i+2]]++;
59        if(flags&PIPI_COLOR_G)
60            h->g[data[i+1]]++;
61        if(flags&PIPI_COLOR_B)
62            h->b[data[i]]++;
63        if(flags&PIPI_COLOR_Y)
64        {
65            uint32_t p = 0.;
66            p += 0.299 * data[i];
67            p += 0.587 * data[i+1];
68            p += 0.114 * data[i+2];
69
70            h->y[p>255?255:p]++;
71        }
72    }
73
74    /* Normalize dataset */
75    if(flags&PIPI_COLOR_R)
76    {
77        max = 0;
78        for(i=0; i<256; i++)
79            if(h->r[i] > max) max = h->r[i];
80        n = 255.0f / max;
81        for(i=0; i<256; i++)
82            h->r[i]*=n;
83    }
84    if(flags&PIPI_COLOR_G)
85    {
86        max = 0;
87        for(i=0; i<256; i++)
88            if(h->g[i] > max) max = h->g[i];
89        n = 255.0f / max;
90        for(i=0; i<256; i++)
91            h->g[i]*=n;
92    }
93    if(flags&PIPI_COLOR_B)
94    {
95        max = 0;
96        for(i=0; i<256; i++)
97            if(h->b[i] > max) max = h->b[i];
98        n = 255.0f / max;
99        for(i=0; i<256; i++)
100            h->b[i]*=n;
101    }
102    if(flags&PIPI_COLOR_A)
103    {
104        max = 0;
105        for(i=0; i<256; i++)
106            if(h->a[i] > max) max = h->a[i];
107        n = 255.0f / max;
108        for(i=0; i<256; i++)
109            h->a[i]*=n;
110    }
111    if(flags&PIPI_COLOR_Y)
112    {
113        max = 0;
114        for(i=0; i<256; i++)
115            if(h->y[i] > max) max = h->y[i];
116        n = 255.0f / max;
117        for(i=0; i<256; i++)
118            h->y[i]*=n;
119    }
120
121    return 0;
122}
123
124int pipi_render_histogram(pipi_image_t *img, pipi_histogram_t*h, int flags)
125{
126    int x;
127
128    if(!img || !h) return -1;
129
130    for(x=0; x<256; x++)
131    {
132        if(flags&PIPI_COLOR_R)
133            pipi_draw_line(img,
134                           x, 255,
135                           x, 255 - h->r[x],
136                           0x00FF0000,
137                           0);
138        if(flags&PIPI_COLOR_G)
139            pipi_draw_line(img,
140                           x, 255,
141                           x, 255 - h->g[x],
142                           0x0000FF00,
143                           0);
144        if(flags&PIPI_COLOR_B)
145            pipi_draw_line(img,
146                           x, 255,
147                           x, 255 - h->b[x],
148                           0x000000FF,
149                           0);
150        if(flags&PIPI_COLOR_A)
151            pipi_draw_line(img,
152                           x, 255,
153                           x, 255 - h->a[x],
154                           0x00000FFF,
155                           0);
156        if(flags&PIPI_COLOR_Y)
157            pipi_draw_line(img,
158                           x, 255,
159                           x, 255 - h->y[x],
160                           0x00FFFFFF,
161                           0);
162    }
163
164    return 0;
165}
166
167
168int pipi_free_histogram(pipi_histogram_t* h)
169{
170    if(h) free(h);
171    else  return -1;
172
173    return 0;
174}
Note: See TracBrowser for help on using the repository browser.