不想再继续为汉语编程的问题浪费时间,印度的SKTN下场怎么样大家一目了然。

 

  而在我Blog发表评论的,只要是用人类语言,我都可以接受。就算有个别不用人类语言的,有空时我也会尽量帮那些生物往人类语言方向矫正。


  ——————————————————————————————


  我们都知道,微软对其原有GDI(Graphics Device Interface)改进后形成了现在的GDI+。作为图形设备接口GDI的继任者,其对GDI的很多功能都进行了优化,而且还提供了许多方便实用的附加功能。


  以此为基础,在.Net环境下可以很轻松的完成一系列复杂的图形操作。而与之相较,Java的图像接口在图像处理功能上则略显单薄,而部分操作较之C#等还有些复杂。


  所以最近我打算在本人的loonframework项目中将一些java图像接口二次封装,及添加部分新的功能进入。下面我公布的,是一些在 Loonframework框架中将新添加的图像处理类。当然,这些还在测试阶段,最后的确定版估计会与此有较大出入,有改进意见的欢迎邮寄到我的 Email:ceponline@yahoo.com.cn。(最近挺懒的……一写代码就犯困……下班只看漫画度日……)


BaseImage.java:

 

package org.loon.framework.game.test.p_w_picpath;


import java.awt.Image;


/** *//**

 * <p>

 * Title: LoonFramework

 * </p>

 * <p>

 * Description:基础Bitmap接口

 * </p>

 * <p>

 * Copyright: Copyright (c) 2007

 * </p>

 * <p>

 * Company: LoonFramework

 * </p>

 *

 * @author chenpeng

 * @email:[email]ceponline@yahoo.com.cn[/email]

 * @version 0.1

 */

public interface BaseImage ...{


    final static int BITMAPFILEHEADER_SIZE = 14;


    final static int BITMAPINFOHEADER_SIZE = 40;


    abstract int getWidth();


    abstract int getHeight();


    abstract LColor getPixel(int x, int y);


    /** *//**

     * 设定像素点

     *

     * @param x

     * @param y

     * @param rgb

     * @return

     */

    abstract boolean setPixel(int x, int y, int rgb);


    abstract boolean setPixel(int x, int y, int r, int g, int b);


    abstract boolean setPixel(int x, int y, LColor color);


    /** *//**

     * 移动像素

     *

     * @param dx

     * @param dy

     */

    abstract void movePixels(int dx, int dy);


    /** *//**

     * 清除像素

     *

     * @param rgb

     */

    abstract void clear(int rgb);


    /** *//**

     * 获得LGraphics

     *

     * @return

     */

    abstract LGraphics getLGraphics();


    abstract Image getImage();


    /** *//**

     * 设定指定x,y交集

     *

     * @param x

     * @param y

     * @return

     */

    abstract boolean setTransparent(int x, int y);


    /** *//**

     * 设定指定color出现处

     *

     * @param val

     */

    abstract void setTransparent(LColor color);


    /** *//**

     * 替换指定颜色

     *

     * @param color1

     * @param color2

     */

    abstract void setDisplace(LColor color1, LColor color2);


    /** *//**

     * 保存自身到指定路径

     *

     * @param path

     */

    abstract void save(String path);


    /** *//**

     * 保存图像到指定路径

     *

     * @param p_w_picpath

     * @param path

     */

    abstract void save(Image p_w_picpath, String path);


    /** *//**

     * 保存图像到指定路径为指定大小

     *

     * @param p_w_picpath

     * @param path

     * @param width

     * @param height

     */

    abstract void save(Image p_w_picpath, String path, int width, int height);


}


LColor.java:

package org.loon.framework.game.test.p_w_picpath;

/** *//**

 * <p>Title: LoonFramework</p>

 * <p>Description:loonframework用color</p>

 * <p>Copyright: Copyright (c) 2007</p>

 * <p>Company: LoonFramework</p>

 * @author chenpeng 

 * @email:[email]ceponline@yahoo.com.cn[/email]

 * @version 0.1

 */

public class LColor ...{

   

   

    int R=0;

    int G=0;

    int B=0;

   

    public LColor()...{}

   

    /** *//**

     * 注入r,g,b数值

     * @param r

     * @param g

     * @param b

     */

    public LColor(int r,int g,int b)...{

        this.R=r;

        this.G=g;

        this.B=b;

    }

}


LGraphics:


package org.loon.framework.game.test.p_w_picpath;


import java.awt.Color;

import java.awt.Font;

import java.awt.FontMetrics;

import java.awt.Graphics;

import java.awt.Polygon;

import java.awt.font.LineMetrics;


import org.loon.framework.game.test.p_w_picpath.BaseImage;


/** *//**

 * <p>Title: LoonFramework</p>

 * <p>Description:loonframework用graphics,开发中……</p>

 * <p>Copyright: Copyright (c) 2007</p>

 * <p>Company: LoonFramework</p>

 * @author chenpeng 

 * @email:[email]ceponline@yahoo.com.cn[/email]

 * @version 0.1

 */

public class LGraphics ...{


    Graphics _g = null;


    Font _font;


    public LGraphics() ...{

        _font = new Font(null, Font.PLAIN, 12);

    }


    public LGraphics(Graphics g) ...{


        _font = new Font(null, Font.PLAIN, 12);


        setGraphics(g);


    }


    public void setGraphics(Graphics g) ...{


        _g = g;


        _g.setFont(_font);


    }


    public void setRGB(int rgb) ...{


        _g.setColor(new Color(rgb));


    }


    public void setRGB(int r, int g, int b) ...{


        int rgb = (r << 16) | (g << 8) | b;


        _g.setColor(new Color(rgb));


    }


    public void drawLine(int x1, int y1, int x2, int y2, int rgb) ...{


        setRGB(rgb);


        _g.drawLine(x1, y1, x2, y2);


    }


    public void drawRect(int x, int y, int width, int height) ...{

        _g.drawRect(x, y, width, height);

    }


    public void drawRect(int x, int y, int width, int height, int rgb) ...{


        setRGB(rgb);


        _g.drawRect(x, y, width, height);


    }


    public void fillRect(int x, int y, int width, int height) ...{

        _g.fillRect(x, y, width, height);

    }


    public void fillRect(int x, int y, int width, int height, int rgb) ...{


        setRGB(rgb);


        _g.fillRect(x, y, width, height);


    }


    public void fillTriangle(int x1, int y1, int x2, int y2, int x3, int y3) ...{


        if (_g == null) ...{

            return;

        }


        Polygon p = new Polygon();


        p.addPoint(x1, y1);

        p.addPoint(x2, y2);

        p.addPoint(x3, y3);


        _g.fillPolygon(p);


    }


    public void drawImage(BaseImage img, int x, int y) ...{

        _g.drawImage(img.getImage(), x, y, null);

    }


    public int getStringWidth(String str) ...{


        if (str == null || str.length() < 1) ...{

            return 0;

        }


        FontMetrics fm = _g.getFontMetrics();


        int w = 0;


        w = fm.stringWidth(str);


        return w;


    }


    public int getStringHeight(String str) ...{


        if (str == null || str.length() < 1) ...{

            return 0;

        }


        FontMetrics fm = _g.getFontMetrics();


        LineMetrics lm = fm.getLineMetrics(str, _g);


        int h = 0;


        h = (int)(lm.getHeight());


        return h;


    }


    public void drawString(String str, int x, int y) ...{


        y += getStringHeight(str);


        _g.drawString(str, x, y);


    }


    public void drawString(String str, int x, int y, int rgb) ...{


        setRGB(rgb);


        drawString(str, x, y);


    }


    public Graphics getGraphics() ...{

        return _g;

    }


}



Bitmap.java:(你没看错,偶就是在学M$……)


package org.loon.framework.game.test.p_w_picpath;


import java.awt.AlphaComposite;

import java.awt.Container;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.Image;

import java.awt.MediaTracker;

import java.awt.Toolkit;

import java.awt.Transparency;

import java.awt.color.ColorSpace;

import java.awt.p_w_picpath.BufferedImage;

import java.awt.p_w_picpath.ColorModel;

import java.awt.p_w_picpath.ComponentColorModel;

import java.awt.p_w_picpath.DataBuffer;

import java.awt.p_w_picpath.DataBufferByte;

import java.awt.p_w_picpath.PixelGrabber;

import java.awt.p_w_picpath.Raster;

import java.awt.p_w_picpath.WritableRaster;

import java.io.BufferedInputStream;

import java.io.ByteArrayOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;


/** *//**

 * <p>

 * Title: LoonFramework

 * </p>

 * <p>

 * Description:loonframework用Bitmap,封装了p_w_picpath的相关操作,开发中……

 * </p>

 * <p>

 * Copyright: Copyright (c) 2007

 * </p>

 * <p>

 * Company: LoonFramework

 * </p>

 *

 * @author chenpeng

 * @email:[email]ceponline@yahoo.com.cn[/email]

 * @version 0.1

 */

public class Bitmap implements Cloneable, BaseImage ...{


    byte _bitmapFileHeader[] = new byte[14];


    byte _bfType[] = ...{ 'B', 'M' };


    int _bfReserved1 = 0;


    int _bfReserved2 = 0;


    int _bfOffBits = BITMAPFILEHEADER_SIZE + BITMAPINFOHEADER_SIZE;


    byte _bitmapInfoHeader[] = new byte[40];


    int _biPlanes = 1;


    int _biBitCount = 24;


    int _biCompression = 0;


    int _biXPelsPerMeter = 0x0;


    int _biYPelsPerMeter = 0x0;


    int _biClrUsed = 0;


    int _biClrImportant = 0;


    int _bfSize = 0;


    int _biSizeImage = 0x030000;


    int _biSize = BITMAPINFOHEADER_SIZE;


    int _biWidth = 0;


    int _biHeight = 0;


    int _bitmap[];


    FileOutputStream _output;


    private BufferedImage _img;


    private LGraphics _g;


    private BufferedImage _back;


    private Graphics2D _bg;


    /** *//**

     * 将byte[]转为p_w_picpath

     *

     * @param bytes

     * @return

     */

    public Image getImage(byte[] bytes) ...{

        return Toolkit.getDefaultToolkit().createImage(bytes);

    }


    /** *//**

     * 获得BufferedImage

     *

     * @param width

     * @param height

     * @param data

     * @return

     */

    public BufferedImage getBufferedImage(int width, int height, byte[] data) ...{

        DataBuffer buffer = new DataBufferByte(data, width * height);

        int pixelStride = 4;

        int scanlineStride = 4 * width;

        int[] bandOffsets = ...{ 0, 1, 2 };

        WritableRaster raster = Raster.createInterleavedRaster(buffer, width,

                height, scanlineStride, pixelStride, bandOffsets, null);

        ColorSpace colorSpace = ColorSpace.getInstance(ColorSpace.CS_sRGB);

        boolean hasAlpha = false;

        boolean isAlphaPremultiplied = false;

        int transparency = Transparency.OPAQUE;

        int transferType = DataBuffer.TYPE_BYTE;

        ColorModel colorModel = new ComponentColorModel(colorSpace, hasAlpha,

                isAlphaPremultiplied, transparency, transferType);

        return new BufferedImage(colorModel, raster, isAlphaPremultiplied, null);

    }


    /** *//**

     * 生成指定宽与高的空白图像。

     *

     * @param width

     * @param height

     */

    public Bitmap(int width, int height) ...{


        try ...{

            _img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        } catch (Exception e) ...{

            _img = null;

        }


        if (_img != null) ...{


            _g = new LGraphics();

            _g.setGraphics(_img.createGraphics());


        } else ...{

            _g = null;

        }


        try ...{

            _back = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        } catch (Exception e) ...{

            _back = null;

        }


        if (_back != null) ...{

            _bg = _back.createGraphics();

        } else ...{

            _bg = null;

        }


    }


    /** *//**

     * 追踪载入图像的实例

     *

     * @param p_w_picpath

     */

    final private void trackerImage(Image p_w_picpath) ...{

        MediaTracker mediaTracker = new MediaTracker(new Container());

        mediaTracker.addImage(p_w_picpath, 0);

        try ...{

            mediaTracker.waitForID(0);

        } catch (InterruptedException e) ...{

            e.printStackTrace();

        }


    }


    /** *//**

     * 以pixels构造bitmap

     *

     * @param width

     * @param height

     * @param pixels

     */

    public Bitmap(int width, int height, int[] pixels) ...{


        try ...{

            _img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        } catch (Exception e) ...{

            _img = null;

        }


        if (_img != null) ...{


            _g = new LGraphics();


            _g.setGraphics(_img.getGraphics());


        } else ...{

            _g = null;

        }


        if (_img == null || pixels.length < width * height) ...{

            return;

        }


        for (int i = 0; i < height; i++) ...{

            for (int j = 0; j < width; j++) ...{

                setPixel(j, i, pixels[j + i * width]);

            }

        }


        try ...{

            _back = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        } catch (Exception e) ...{

            _back = null;

        }


        if (_back != null) ...{

            _bg = _back.createGraphics();

        } else ...{

            _bg = null;

        }


    }


    /** *//**

     * 以指定路径载入bitmap

     *

     * @param path

     */

    public Bitmap(String path) ...{

        this(getDataSource(path));

    }


    /** *//**

     * 以inputstream载入bitmap

     *

     * @param inputstream

     */

    public Bitmap(InputStream inputstream) ...{

        this(getDataSource(inputstream));

    }


    /** *//**

     * 将byte[]转为bitmap

     *

     * @param data

     */

    public Bitmap(byte[] data) ...{

        this(Toolkit.getDefaultToolkit().createImage(data));

    }


    /** *//**

     * 将p_w_picpath直接注入bitmap

     *

     * @param data

     */

    public Bitmap(Image p_w_picpath) ...{

        try ...{

            _img = getBufferedImage(p_w_picpath);

        } catch (Exception e) ...{

            _img = null;

        }

        if (_img != null) ...{

            _g = new LGraphics();

            _g.setGraphics(_img.createGraphics());


            try ...{

                _back = new BufferedImage(_img.getWidth(), _img.getHeight(),

                        BufferedImage.TYPE_INT_RGB);

            } catch (Exception e) ...{

                _back = null;

            }

            if (_back != null) ...{

                _bg = _back.createGraphics();

            } else ...{

                _bg = null;

            }


        } else ...{

            _g = null;

        }


    }


    /** *//**

     * 通过物理路径获得byte[]

     *

     * @param name

     * @return

     */

    final static private byte[] getDataSource(String name) ...{

        FileInputStream fileInput;

        try ...{

            fileInput = new FileInputStream(new File(name));

        } catch (FileNotFoundException e) ...{

            fileInput = null;

        }

        BufferedInputStream bufferedInput = new BufferedInputStream(fileInput);

        return getDataSource(bufferedInput);

    }


    /** *//**

     * 将p_w_picpath转为BufferedImage

     *

     * @param p_w_picpath

     * @return

     */

    public BufferedImage getBufferedImage(Image p_w_picpath) ...{

        trackerImage(p_w_picpath);

        int width = p_w_picpath.getWidth(null);

        int height = p_w_picpath.getHeight(null);

        BufferedImage bufferedp_w_picpath = new BufferedImage(width, height,

                BufferedImage.TYPE_INT_RGB);

        Graphics g = bufferedp_w_picpath.getGraphics();

        g.drawImage(p_w_picpath, 0, 0, null);

        return bufferedp_w_picpath;

    }


    /** *//**

     * 通过InputStream获得byte[]

     *

     * @param is

     * @return

     */

    final static private byte[] getDataSource(InputStream is) ...{

        if (is == null) ...{

            return null;

        }

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

        byte[] arrayByte = null;

        try ...{

            byte[] bytes = new byte[4096];

            bytes = new byte[is.available()];

            int read;

            while ((read = is.read(bytes)) >= 0) ...{

                byteArrayOutputStream.write(bytes, 0, read);

            }

            arrayByte = byteArrayOutputStream.toByteArray();

        } catch (IOException e) ...{

            return null;

        } finally ...{

            try ...{

                if (byteArrayOutputStream != null) ...{

                    byteArrayOutputStream.close();

                    byteArrayOutputStream = null;

                }

                if (is != null) ...{

                    is.close();

                    is = null;

                }


            } catch (IOException e) ...{

            }

        }

        // 返回byte[]

        return arrayByte;

    }


    /** *//**

     * 获得图像宽

     */

    public int getWidth() ...{


        if (_img == null) ...{

            return 0;

        }


        return _img.getWidth();


    }


    /** *//**

     * 获得图像高

     */

    public int getHeight() ...{


        if (_img == null) ...{

            return 0;

        }


        return _img.getHeight();


    }


    /** *//**

     * 获得指定x,y交集处的图像color

     */

    public LColor getPixel(int x, int y) ...{

        if (_img == null || x < 0 || x >= getWidth() || y < 0

                || y >= getHeight()) ...{

            return null;

        }

        int c = _img.getRGB(x, y);

        LColor color = new LColor();

        color.R = (c & 0x00ff0000) >> 16;

        color.G = (c & 0x0000ff00) >> 8;

        color.B = c & 0x000000ff;

        return color;

    }


    /** *//**

     * 返回p_w_picpath实例

     */

    public Image getImage() ...{

        return _img;

    }


    /** *//**

     * 返回Graphics

     */

    public LGraphics getLGraphics() ...{

        return _g;

    }



稍微长点居然发不了,分割………………………………



    /** *//**

     * 设定指定x,y交集处rgb颜色

     */

    public boolean setPixel(int x, int y, int rgb) ...{


        if (_img == null || x < 0 || x >= getWidth() || y < 0

                || y >= getHeight()) ...{

            return false;

        }


        _img.setRGB(x, y, rgb);


        return true;


    }


    /** *//**

     * 设定指定x,y交集处rgb颜色(分别注入)

     */

    public boolean setPixel(int x, int y, int r, int g, int b) ...{


        if (_img == null || x < 0 || x >= getWidth() || y < 0

                || y >= getHeight()) ...{

            return false;

        }


        int rgb = (r << 16) | (g << 8) | b;


        _img.setRGB(x, y, rgb);


        return true;


    }


    /** *//**

     * 设定指定x,y交集处color

     *

     * @param x

     * @param y

     * @param color

     * @return

     */

    public boolean setPixel(int x, int y, LColor color) ...{

        if (_img == null || x < 0 || x >= getWidth() || y < 0

                || y >= getHeight()) ...{

            return false;

        }

        int rgb = (color.R << 16) | (color.G << 8) | color.B;

        _img.setRGB(x, y, rgb);

        return true;

    }


    /** *//**

     * 设定指定x,y交集像素点。

     */

    public boolean setTransparent(int x, int y) ...{

        if (_img == null || x < 0 || x >= getWidth() || y < 0

                || y >= getHeight()) ...{

            return false;

        }

        _img.setRGB(x, y, 0x00000000);

        return true;


    }


    /** *//**

     * 设定整个Bitmap的透明度

     *

     * @param d

     */

    public void setScaleTransform(double d) ...{

        int width = getWidth();

        int height = getHeight();

        BufferedImage back = null;

        Graphics bottom = null;

        Image screen = null;

        Graphics gb = null;

        try ...{

            back = new BufferedImage(width, height, 2);

            bottom = back.getGraphics();

            screen = new BufferedImage(width, height, 1);

            gb = screen.getGraphics();

            AlphaComposite alphacomposite = AlphaComposite.getInstance(3,

                    (float) d);

            ((Graphics2D) gb).setComposite(alphacomposite);

            gb.drawImage(_img, 0, 0, null);

            bottom.drawImage(screen, 0, 0, null);

            _img = back;

        } catch (Exception ex) ...{


        } finally ...{

            if (gb != null) ...{

                gb = null;

            }

            if (screen != null) ...{

                screen.flush();

                screen = null;

            }

            if (bottom != null) ...{

                bottom = null;

            }

            if (back != null) ...{

                back.flush();

                back = null;

            }

        }


    }


    /** *//**

     * 设定p_w_picpath中指定color数值

     */

    public void setTransparent(LColor color) ...{


        WritableRaster wr = _img.getRaster();

        int width = getWidth();

        int height = getHeight();

        if (wr == null || width < 1 || height < 1) ...{

            return;

        }

        for (int i = 0; i < width; i++) ...{

            for (int j = 0; j < height; j++) ...{

                int c = _img.getRGB(i, j);

                LColor cr = new LColor();

                cr.R = (c & 0x00ff0000) >> 16;

                cr.G = (c & 0x0000ff00) >> 8;

                cr.B = c & 0x000000ff;

                if ((cr.R == color.R) && (cr.G == color.G) && (cr.B == color.B)) ...{

                    wr.setSample(i, j, 0, 0x00000000);

                }

            }

        }

    }


    /** *//**

     * 替换指定颜色

     *

     * @param color1

     * @param color2

     */

    public void setDisplace(LColor color1, LColor color2) ...{

        WritableRaster wr = _img.getRaster();

        int width = getWidth();

        int height = getHeight();

        if (wr == null || width < 1 || height < 1) ...{

            return;

        }

        for (int x = 0; x < width; x++) ...{

            for (int y = 0; y < height; y++) ...{

                int c = _img.getRGB(x, y);

                LColor cr = new LColor();

                cr.R = (c & 0x00ff0000) >> 16;

                cr.G = (c & 0x0000ff00) >> 8;

                cr.B = c & 0x000000ff;

                if ((cr.R == color1.R) && (cr.G == color1.G)

                        && (cr.B == color1.B)) ...{

                    int rgb = (color2.R << 16) | (color2.G << 8) | color2.B;

                    _img.setRGB(x, y, rgb);

                }

            }

        }

    }


    /** *//**

     * 移动指定像素点

     */

    public void movePixels(int dx, int dy) ...{


        _bg.drawImage(_img, null, 0, 0);


        ((Graphics2D) (_g.getGraphics())).drawImage(_back, null, dx, dy);


    }


    /** *//**

     * 克隆自身

     */

    final public Object clone() throws CloneNotSupportedException ...{

        return (Bitmap) super.clone();

    }


    /** *//**

     * bmp文件保存处理,内部调用。

     *

     * @return

     */

    final private BMPSave BMP() ...{

        return new BMPSave();

    }


    /** *//**

     * 保存自身到指定路径

     *

     * @param path

     */

    public void save(String path) ...{

        this.BMP().saveBitmap(path, _img, _img.getWidth(null),

                _img.getHeight(null));

    }


    /** *//**

     * 保存图像到指定路径

     *

     * @param p_w_picpath

     * @param path

     */

    public void save(Image p_w_picpath, String path) ...{

        this.BMP().saveBitmap(path, p_w_picpath, p_w_picpath.getWidth(null),

                p_w_picpath.getHeight(null));

    }


    /** *//**

     * 保存图像到指定路径为指定大小

     *

     * @param p_w_picpath

     * @param path

     * @param width

     * @param height

     */

    public void save(Image p_w_picpath, String path, int width, int height) ...{

        this.BMP().saveBitmap(path, p_w_picpath, width, height);

    }


    /** *//**

     * 清除指定rgb

     */

    public void clear(int rgb) ...{


        if (_img == null || _g == null) ...{

            return;

        }


        _g.setRGB(rgb);


        _g.fillRect(0, 0, _img.getWidth(), _img.getHeight());


    }


    class BMPSave ...{


        /** *//**

         *

         */

        private static final long serialVersionUID = 1L;


        /** *//**

         * 仅限此类内部使用

         *

         */

        private BMPSave() ...{

        }


        public void saveBitmap(String parFilename, Image parImage,

                int parWidth, int parHeight) ...{

            try ...{

                _output = new FileOutputStream(parFilename);

                save(parImage, parWidth, parHeight);

                _output.close();

            } catch (Exception saveEx) ...{

                saveEx.printStackTrace();

            }

        }


        private void save(Image parImage, int parWidth, int parHeight) ...{

            try ...{

                convertImage(parImage, parWidth, parHeight);

                writeBitmapFileHeader();

                writeBitmapInfoHeader();

                writeBitmap();

            } catch (Exception saveEx) ...{

                saveEx.printStackTrace();

            }

        }


        private boolean convertImage(Image parImage, int parWidth, int parHeight) ...{

            int pad;

            _bitmap = new int[parWidth * parHeight];

            PixelGrabber pg = new PixelGrabber(parImage, 0, 0, parWidth,

                    parHeight, _bitmap, 0, parWidth);

            try ...{

                pg.grabPixels();

            } catch (InterruptedException e) ...{

                e.printStackTrace();

                return (false);

            }

            pad = (4 - ((parWidth * 3) % 4)) * parHeight;

            _biSizeImage = ((parWidth * parHeight) * 3) + pad;

            _bfSize = _biSizeImage + BITMAPFILEHEADER_SIZE

                    + BITMAPINFOHEADER_SIZE;

            _biWidth = parWidth;

            _biHeight = parHeight;

            return (true);

        }


        private void writeBitmap() ...{

            int size;

            int value;

            int j;

            int i;

            int rowCount;

            int rowIndex;

            int lastRowIndex;

            int pad;

            int padCount;

            byte rgb[] = new byte[3];

            size = (_biWidth * _biHeight) - 1;

            pad = 4 - ((_biWidth * 3) % 4);

            if (pad == 4) ...{

                pad = 0;

            }

            rowCount = 1;

            padCount = 0;

            rowIndex = size - _biWidth;

            lastRowIndex = rowIndex;

            try ...{

                for (j = 0; j < size; j++) ...{

                    value = _bitmap[rowIndex];

                    rgb[0] = (byte) (value & 0xFF);

                    rgb[1] = (byte) ((value >> 8) & 0xFF);

                    rgb[2] = (byte) ((value >> 16) & 0xFF);

                    _output.write(rgb);

                    if (rowCount == _biWidth) ...{

                        padCount += pad;

                        for (i = 1; i <= pad; i++) ...{

                            _output.write(0x00);

                        }

                        rowCount = 1;

                        rowIndex = lastRowIndex - _biWidth;

                        lastRowIndex = rowIndex;

                    } else

                        rowCount++;

                    rowIndex++;

                }

                _bfSize += padCount - pad;

                _biSizeImage += padCount - pad;

            } catch (Exception wb) ...{

                wb.printStackTrace();

            }

        }


        private void writeBitmapFileHeader() ...{

            try ...{

                _output.write(_bfType);

                _output.write(intToDWord(_bfSize));

                _output.write(intToWord(_bfReserved1));

                _output.write(intToWord(_bfReserved2));

                _output.write(intToDWord(_bfOffBits));

            } catch (Exception wbfh) ...{

                wbfh.printStackTrace();

            }

        }


        private void writeBitmapInfoHeader() ...{

            try ...{

                _output.write(intToDWord(_biSize));

                _output.write(intToDWord(_biWidth));

                _output.write(intToDWord(_biHeight));

                _output.write(intToWord(_biPlanes));

                _output.write(intToWord(_biBitCount));

                _output.write(intToDWord(_biCompression));

                _output.write(intToDWord(_biSizeImage));

                _output.write(intToDWord(_biXPelsPerMeter));

                _output.write(intToDWord(_biYPelsPerMeter));

                _output.write(intToDWord(_biClrUsed));

                _output.write(intToDWord(_biClrImportant));

            } catch (Exception wbih) ...{

                wbih.printStackTrace();

            }

        }


        private byte[] intToWord(int parValue) ...{

            byte retValue[] = new byte[2];

            retValue[0] = (byte) (parValue & 0x00FF);

            retValue[1] = (byte) ((parValue >> 8) & 0x00FF);

            return (retValue);

        }


        private byte[] intToDWord(int parValue) ...{

            byte retValue[] = new byte[4];

            retValue[0] = (byte) (parValue & 0x00FF);

            retValue[1] = (byte) ((parValue >> 8) & 0x000000FF);

            retValue[2] = (byte) ((parValue >> 16) & 0x000000FF);

            retValue[3] = (byte) ((parValue >> 24) & 0x000000FF);

            return (retValue);

        }


    }


}




先保存一下再继续……


使用示例,实现了一个图形的油画效果:



package org.loon.framework.game.test.p_w_picpath;


import java.awt.Color;

import java.awt.Frame;

import java.awt.Graphics;

import java.awt.Panel;

import java.util.Random;


/** *//**

 * <p>

 * Title: LoonFramework

 * </p>

 * <p>

 * Description:

 * </p>

 * <p>

 * Copyright: Copyright (c) 2007

 * </p>

 * <p>

 * Company: LoonFramework

 * </p>

 *

 * @author chenpeng

 * @email:[email]ceponline@yahoo.com.cn[/email]

 * @version 0.1

 */


public class MyPanel extends Panel ...{


    /** *//**

     *

     */

    private static final long serialVersionUID = 1L;


    Bitmap _bitmap = null;


    public MyPanel(Bitmap bitmap) ...{


        _bitmap = bitmap;


        setLayout(null);


        setBackground(Color.BLACK);

    }


    public void paint(Graphics g) ...{


        // 加载原始图

        g.drawImage(_bitmap.getImage(), 0, 0, this);

        // 图像间隔

        int space = 2;

        // 加载loonframework color

        LColor color = new LColor();

        // 产生随机数

        Random rand = new Random();

        // 偏移度

        int offset = 3;

        for (int i = 0; i < _bitmap.getWidth() - offset; i++) ...{

            for (int j = 0; j < _bitmap.getHeight() - offset; j++) ...{

                // 产生随机颗粒

                int a = rand.nextInt(1000) % offset;

                color = _bitmap.getPixel(i + a, j + a);

                // 重新注入r,g,b

                _bitmap.setPixel(i, j, color);

            }

        }

        // 绘制

        g.drawImage(_bitmap.getImage(), _bitmap.getWidth()+space, 0, this);


    }


    public static void main(String[] args) ...{


        Frame frm = new Frame("Java油画效果(本示例由Loonframework框架提供)");

        frm.setSize(600, 364);

        frm.setResizable(false);

        frm.add(new MyPanel(new Bitmap("c:/cc0.jpg")));

        frm.setVisible(true);


    }


}


原图:


 


示例效果图: