Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Sepia tone image filter for Java

2,183 views
Skip to first unread message

Macky G

unread,
Jun 30, 2009, 2:03:09 AM6/30/09
to
After spending hours searching the web and not finding an answer, I
finally put together a function to create sepia images with Java.
This function produces amazing results, I'm very happy with it. I
hope it saves everyone time...

(You'll need your image to be in a BufferedImage object. The web has
plenty of tutorials for that.)


/**
*
* @param img Image to modify
* @param sepiaIntensity From 0-255, 30 produces nice results
* @throws Exception
*/
public static void applySepiaFilter(BufferedImage img, int
sepiaIntensity) throws Exception
{
// Play around with this. 20 works well and was recommended
// by another developer. 0 produces black/white image
int sepiaDepth = 20;

int w = img.getWidth();
int h = img.getHeight();

WritableRaster raster = img.getRaster();

// We need 3 integers (for R,G,B color values) per pixel.
int[] pixels = new int[w*h*3];
raster.getPixels(0, 0, w, h, pixels);

// Process 3 ints at a time for each pixel. Each pixel has 3 RGB
colors in array
for (int i=0;i<pixels.length; i+=3)
{
int r = pixels[i];
int g = pixels[i+1];
int b = pixels[i+2];

int gry = (r + g + b) / 3;
r = g = b = gry;
r = r + (sepiaDepth * 2);
g = g + sepiaDepth;

if (r>255) r=255;
if (g>255) g=255;
if (b>255) b=255;

// Darken blue color to increase sepia effect
b-= sepiaIntensity;

// normalize if out of bounds
if (b<0) b=0;
if (b>255) b=255;

pixels[i] = r;
pixels[i+1]= g;
pixels[i+2] = b;
}
raster.setPixels(0, 0, w, h, pixels);
}

Qu0ll

unread,
Jun 30, 2009, 4:16:38 AM6/30/09
to
"Macky G" <mack...@gmail.com> wrote in message
news:26a272f4-3e52-439d...@r33g2000yqn.googlegroups.com...

> After spending hours searching the web and not finding an answer, I
> finally put together a function to create sepia images with Java.
> This function produces amazing results, I'm very happy with it. I
> hope it saves everyone time...
>
> (You'll need your image to be in a BufferedImage object. The web has
> plenty of tutorials for that.)

[code snipped]

Thanks for that - it's a nice effect. It crashed the first time I used it
because the image I tried it on had alpha values (i.e. a translucent image)
and your code does not cater for that. I simply changed the code to use a
larger array (based on width * height * 4) and also to loop through using
increments of 4. You might like to change the code to check for translucent
images and handle them appropriately.

--
And loving it,

-Qu0ll (Rare, not extinct)
_________________________________________________
Qu0llS...@gmail.com
[Replace the "SixFour" with numbers to email me]

Macky G

unread,
Jun 30, 2009, 12:10:45 PM6/30/09
to
Qu0ll: Thanks for the comment, that's great advice. I'll definitely
use your code to handle alpha images.

Macky G

unread,
Jun 30, 2009, 12:16:51 PM6/30/09
to
Also, I'd like to give credit to "hiwa" who posted the original color
adjustment code I started from: http://forums.sun.com/thread.jspa?threadID=728795

Thanks hiwa!

jf49...@gmail.com

unread,
Jul 12, 2014, 4:49:16 PM7/12/14
to
Hi: this code works super good. I have converted it to BBC Bacic for Windows. what is your full name as I like to pass on credit to my group where due.
Thank you John Fortier

Roedy Green

unread,
Jul 14, 2014, 5:12:48 AM7/14/14
to
On Sat, 12 Jul 2014 13:49:16 -0700 (PDT), jf49...@gmail.com wrote,
quoted or indirectly quoted someone who said :

> // Darken blue color to increase sepia effect

Hmm. I thought sepia added a brown tone, e.g. more yellow and red.
--
Roedy Green Canadian Mind Products http://mindprod.com
A program is only as good as its worst piece of code.
~ Joshua Cramer

Joerg Meier

unread,
Jul 14, 2014, 5:24:10 AM7/14/14
to
On Mon, 14 Jul 2014 02:12:48 -0700, Roedy Green wrote:

> On Sat, 12 Jul 2014 13:49:16 -0700 (PDT), jf49...@gmail.com wrote,
> quoted or indirectly quoted someone who said :
>> // Darken blue color to increase sepia effect
> Hmm. I thought sepia added a brown tone, e.g. more yellow and red.

Yes, that is typically what happens when you darken blue. On a computer
screen, "darken" means less of a colour ;)

Liebe Gruesse,
Joerg

--
Ich lese meine Emails nicht, replies to Email bleiben also leider
ungelesen.

Roedy Green

unread,
Jul 15, 2014, 6:59:09 AM7/15/14
to
On Mon, 14 Jul 2014 11:24:10 +0200, Joerg Meier <joerg...@arcor.de>
wrote, quoted or indirectly quoted someone who said :

>Yes, that is typically what happens when you darken blue. On a computer
>screen, "darken" means less of a colour ;)

Of course. I was thinking in terms of paint, where adding more blue
paint would be "darkening" the blue.
--
Roedy Green Canadian Mind Products http://mindprod.com
Science is what we understand well enough to explain to a computer.
Art is everything else we do.
~ Donald Ervin Knuth (born: 1938-01-10 age: 76)

Knute Johnson

unread,
Jul 15, 2014, 1:11:10 PM7/15/14
to
On 7/15/2014 03:59, Roedy Green wrote:
> On Mon, 14 Jul 2014 11:24:10 +0200, Joerg Meier <joerg...@arcor.de>
> wrote, quoted or indirectly quoted someone who said :
>
>> Yes, that is typically what happens when you darken blue. On a computer
>> screen, "darken" means less of a colour ;)
>
> Of course. I was thinking in terms of paint, where adding more blue
> paint would be "darkening" the blue.
>

A sepia tone filter is trickier than I thought. I need to compare the
results from this code with the sepia filter in JavaFX.

import java.awt.*;
import java.awt.color.*;
import java.awt.image.*;
import java.net.*;
import javax.imageio.*;
import javax.swing.*;

public class test0 extends JPanel {
private BufferedImage orig,sepia;

public test0() {
try {
URL url = new URL(
"http://rabbitbrush.frazmtn.com/xlsjacksonhole.jpg");
orig = ImageIO.read(url);
setPreferredSize(new
Dimension(orig.getWidth(),orig.getHeight()*2));

// convert to grayscale and back to RGB
ColorSpace imgCS = orig.getColorModel().getColorSpace();
ColorSpace grayCS = ColorSpace.getInstance(ColorSpace.CS_GRAY);
ColorConvertOp cop = new ColorConvertOp(imgCS,grayCS,null);
sepia = cop.filter(orig,null);
cop = new ColorConvertOp(grayCS,imgCS,null);
sepia = cop.filter(sepia,null);

// slightly enhance the red, slightly reduce the green and
// remove half the blue
float[] factor = new float[] { 1.1f,.9f,.5f };
float[] offset = new float[] { 0f,0f,0f };
RescaleOp rop = new RescaleOp(factor,offset,null);
sepia = rop.filter(sepia,null);
} catch (Exception e) {
e.printStackTrace();
}
}

public void paintComponent(Graphics g2d) {
g2d.drawImage(orig,0,0,null);
g2d.drawImage(sepia,0,sepia.getHeight(),null);
}

public static void main(String... args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
JFrame f = new JFrame("test0");
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.add(new test0(),BorderLayout.CENTER);
f.pack();
f.setVisible(true);
}
});
}
}


--

Knute Johnson

Knute Johnson

unread,
Jul 15, 2014, 1:22:01 PM7/15/14
to
I like these scale factors even better

float[] factor = new float[] { 1.35f,1f,.7f };
Message has been deleted

Knute Johnson

unread,
Jul 17, 2014, 9:53:23 PM7/17/14
to
On 7/17/2014 18:34, Stefan Ram wrote:
> Knute Johnson <ete...@knutejohnson.com> writes:
>> I like these scale factors even better
>> float[] factor = new float[] { 1.35f,1f,.7f };
>
> docs.oracle.com/javafx/2/api/javafx/scene/effect/SepiaTone.html
>

Thanks

--

Knute Johnson

Jeff Higgins

unread,
Jul 19, 2014, 8:18:01 AM7/19/14
to
On 07/15/2014 01:22 PM, Knute Johnson wrote:
> I like these scale factors even better
>
> float[] factor = new float[] { 1.35f,1f,.7f };

"Digital Black and White Conversion | Photoshop"
<http://landscapephoto.us/Articles/DigitalBlackAndWhite.html>
especially "For Further Reading" and beyond.
Seems that the toning process is the easy part.

0 new messages