Grupos de Google ya no admite nuevas publicaciones ni suscripciones de Usenet. El contenido anterior sigue siendo visible.

Sepia tone image filter for Java

Visto 2.189 veces
Saltar al primer mensaje no leído

Macky G

no leída,
30 jun 2009, 2:03:0930/6/09
a
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

no leída,
30 jun 2009, 4:16:3830/6/09
a
"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

no leída,
30 jun 2009, 12:10:4530/6/09
a
Qu0ll: Thanks for the comment, that's great advice. I'll definitely
use your code to handle alpha images.

Macky G

no leída,
30 jun 2009, 12:16:5130/6/09
a
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

no leída,
12 jul 2014, 16:49:1612/7/14
a
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

no leída,
14 jul 2014, 5:12:4814/7/14
a
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

no leída,
14 jul 2014, 5:24:1014/7/14
a
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

no leída,
15 jul 2014, 6:59:0915/7/14
a
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

no leída,
15 jul 2014, 13:11:1015/7/14
a
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

no leída,
15 jul 2014, 13:22:0115/7/14
a
I like these scale factors even better

float[] factor = new float[] { 1.35f,1f,.7f };
Se ha eliminado el mensaje

Knute Johnson

no leída,
17 jul 2014, 21:53:2317/7/14
a
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

no leída,
19 jul 2014, 8:18:0119/7/14
a
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 mensajes nuevos