source: libpipi/trunk/pipi/filter/autocontrast.c @ 2844

Last change on this file since 2844 was 2844, checked in by Sam Hocevar, 11 years ago

Fix headers.

File size: 3.1 KB
Line 
1/*
2 *  libpipi       Pathetic image processing interface library
3 *  Copyright (c) 2004-2008 Sam Hocevar <sam@zoy.org>
4 *                All Rights Reserved
5 *
6 *  $Id$
7 *
8 *  This library is free software. It comes without any warranty, to
9 *  the extent permitted by applicable law. You can redistribute it
10 *  and/or modify it under the terms of the Do What The Fuck You Want
11 *  To Public License, Version 2, as published by Sam Hocevar. See
12 *  http://sam.zoy.org/wtfpl/COPYING for more details.
13 */
14
15/*
16 * autocontrast.c: autocontrast functions
17 * TODO: the current approach is naive; we should use the histogram in order
18 * to decide how to change the contrast.
19 */
20
21#include "config.h"
22#include "common.h"
23
24#include <stdlib.h>
25#include <stdio.h>
26#include <string.h>
27#include <math.h>
28
29#include "pipi.h"
30#include "pipi_internals.h"
31
32pipi_image_t *pipi_autocontrast(pipi_image_t *src)
33{
34    pipi_image_t *dst;
35    pipi_pixels_t *srcp, *dstp;
36    float *srcdata, *dstdata;
37    float min = 1.0, max = 0.0, t;
38    int x, y, w, h, gray;
39
40    w = src->w;
41    h = src->h;
42
43    gray = (src->last_modified == PIPI_PIXELS_Y_F);
44
45    srcp = gray ? pipi_getpixels(src, PIPI_PIXELS_Y_F)
46                : pipi_getpixels(src, PIPI_PIXELS_RGBA_F);
47    srcdata = (float *)srcp->pixels;
48
49    for(y = 0; y < h; y++)
50    {
51        for(x = 0; x < w; x++)
52        {
53            if(gray)
54            {
55                if(srcdata[y * w + x] < min)
56                    min = srcdata[y * w + x];
57                if(srcdata[y * w + x] > max)
58                    max = srcdata[y * w + x];
59            }
60            else
61            {
62                if(srcdata[4 * (y * w + x)] < min)
63                    min = srcdata[4 * (y * w + x)];
64                if(srcdata[4 * (y * w + x)] > max)
65                    max = srcdata[4 * (y * w + x)];
66                if(srcdata[4 * (y * w + x) + 1] < min)
67                    min = srcdata[4 * (y * w + x) + 1];
68                if(srcdata[4 * (y * w + x) + 1] > max)
69                    max = srcdata[4 * (y * w + x) + 1];
70                if(srcdata[4 * (y * w + x) + 2] < min)
71                    min = srcdata[4 * (y * w + x) + 2];
72                if(srcdata[4 * (y * w + x) + 2] > max)
73                    max = srcdata[4 * (y * w + x) + 2];
74            }
75        }
76    }
77
78    if(min >= max)
79        return pipi_copy(src);
80
81    t = 1. / (max - min);
82
83    dst = pipi_new(w, h);
84    dstp = gray ? pipi_getpixels(dst, PIPI_PIXELS_Y_F)
85                : pipi_getpixels(dst, PIPI_PIXELS_RGBA_F);
86    dstdata = (float *)dstp->pixels;
87
88    for(y = 0; y < h; y++)
89    {
90        for(x = 0; x < w; x++)
91        {
92            if(gray)
93            {
94                dstdata[y * w + x] = (srcdata[y * w + x] - min) * t;
95            }
96            else
97            {
98                dstdata[4 * (y * w + x)]
99                    = (srcdata[4 * (y * w + x)] - min) * t;
100                dstdata[4 * (y * w + x) + 1]
101                    = (srcdata[4 * (y * w + x) + 1] - min) * t;
102                dstdata[4 * (y * w + x) + 2]
103                    = (srcdata[4 * (y * w + x) + 2] - min) * t;
104            }
105        }
106    }
107
108    return dst;
109}
110
Note: See TracBrowser for help on using the repository browser.