001    /*
002    Copyright 2006 Jerry Huxtable
003    
004    Licensed under the Apache License, Version 2.0 (the "License");
005    you may not use this file except in compliance with the License.
006    You may obtain a copy of the License at
007    
008       http://www.apache.org/licenses/LICENSE-2.0
009    
010    Unless required by applicable law or agreed to in writing, software
011    distributed under the License is distributed on an "AS IS" BASIS,
012    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013    See the License for the specific language governing permissions and
014    limitations under the License.
015     */
016    
017    package com.github.sarxos.webcam.util.jh;
018    
019    import java.awt.image.BufferedImage;
020    import java.awt.image.WritableRaster;
021    
022    
023    public class JHGrayFilter extends JHFilter {
024    
025            protected boolean canFilterIndexColorModel = true;
026    
027            @Override
028            public BufferedImage filter(BufferedImage src, BufferedImage dst) {
029    
030                    int width = src.getWidth();
031                    int height = src.getHeight();
032                    int type = src.getType();
033    
034                    WritableRaster srcRaster = src.getRaster();
035    
036                    if (dst == null) {
037                            dst = createCompatibleDestImage(src, null);
038                    }
039    
040                    WritableRaster dstRaster = dst.getRaster();
041    
042                    int[] inPixels = new int[width];
043                    for (int y = 0; y < height; y++) {
044                            if (type == BufferedImage.TYPE_INT_ARGB) {
045                                    srcRaster.getDataElements(0, y, width, 1, inPixels);
046                                    for (int x = 0; x < width; x++) {
047                                            inPixels[x] = filterRGB(inPixels[x]);
048                                    }
049                                    dstRaster.setDataElements(0, y, width, 1, inPixels);
050                            } else {
051                                    src.getRGB(0, y, width, 1, inPixels, 0, width);
052                                    for (int x = 0; x < width; x++) {
053                                            inPixels[x] = filterRGB(inPixels[x]);
054                                    }
055                                    dst.setRGB(0, y, width, 1, inPixels, 0, width);
056                            }
057                    }
058    
059                    return dst;
060            }
061    
062            private int filterRGB(int rgb) {
063                    int a = rgb & 0xff000000;
064                    int r = (rgb >> 16) & 0xff;
065                    int g = (rgb >> 8) & 0xff;
066                    int b = rgb & 0xff;
067                    rgb = (r * 77 + g * 151 + b * 28) >> 8; // NTSC luma
068                    return a | (rgb << 16) | (rgb << 8) | rgb;
069            }
070    }