不想再继续为汉语编程的问题浪费时间,印度的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.image;

import
java.awt.Image;


/***/
/**
*<p>
*Title:LoonFramework
*</p>
*<p>
*Description:基础Bitmap接口
*</p>
*<p>
*Copyright:Copyright(c)2007
*</p>
*<p>
*Company:LoonFramework
*</p>
*
*@authorchenpeng
*@email:ceponline@yahoo.com.cn
*@version0.1
*/

public
interface
BaseImage
...
{

finalstaticintBITMAPFILEHEADER_SIZE=14;

finalstaticintBITMAPINFOHEADER_SIZE=40;

abstractintgetWidth();

abstractintgetHeight();

abstractLColorgetPixel(intx,inty);


/***//**
*设定像素点
*
*@paramx
*@paramy
*@paramrgb
*@return
*/
abstractbooleansetPixel(intx,inty,intrgb);

abstractbooleansetPixel(intx,inty,intr,intg,intb);

abstractbooleansetPixel(intx,inty,LColorcolor);


/***//**
*移动像素
*
*@paramdx
*@paramdy
*/
abstractvoidmovePixels(intdx,intdy);


/***//**
*清除像素
*
*@paramrgb
*/
abstractvoidclear(intrgb);


/***//**
*获得LGraphics
*
*@return
*/
abstractLGraphicsgetLGraphics();

abstractImagegetImage();


/***//**
*设定指定x,y交集
*
*@paramx
*@paramy
*@return
*/
abstractbooleansetTransparent(intx,inty);


/***//**
*设定指定color出现处
*
*@paramval
*/
abstractvoidsetTransparent(LColorcolor);


/***//**
*替换指定颜色
*
*@paramcolor1
*@paramcolor2
*/
abstractvoidsetDisplace(LColorcolor1,LColorcolor2);


/***//**
*保存自身到指定路径
*
*@parampath
*/
abstractvoidsave(Stringpath);


/***//**
*保存图像到指定路径
*
*@paramimage
*@parampath
*/
abstractvoidsave(Imageimage,Stringpath);


/***//**
*保存图像到指定路径为指定大小
*
*@paramimage
*@parampath
*@paramwidth
*@paramheight
*/
abstractvoidsave(Imageimage,Stringpath,intwidth,intheight);

}
LColor.java:
package
org.loon.framework.game.test.image;

/***/
/**
*<p>Title:LoonFramework</p>
*<p>Description:loonframework用color</p>
*<p>Copyright:Copyright(c)2007</p>
*<p>Company:LoonFramework</p>
*@authorchenpeng
*@email:ceponline@yahoo.com.cn
*@version0.1
*/

public
class
LColor
...
{


intR=0;
intG=0;
intB=0;


publicLColor()...{}


/***//**
*注入r,g,b数值
*@paramr
*@paramg
*@paramb
*/

publicLColor(intr,intg,intb)...{
this.R=r;
this.G=g;
this.B=b;
}
}
LGraphics:
package
org.loon.framework.game.test.image;

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.image.BaseImage;


/***/
/**
*<p>Title:LoonFramework</p>
*<p>Description:loonframework用graphics,开发中……</p>
*<p>Copyright:Copyright(c)2007</p>
*<p>Company:LoonFramework</p>
*@authorchenpeng
*@email:ceponline@yahoo.com.cn
*@version0.1
*/

public
class
LGraphics
...
{

Graphics_g=null;

Font_font;


publicLGraphics()...{
_font=newFont(null,Font.PLAIN,12);
}


publicLGraphics(Graphicsg)...{

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

setGraphics(g);

}


publicvoidsetGraphics(Graphicsg)...{

_g=g;

_g.setFont(_font);

}


publicvoidsetRGB(intrgb)...{

_g.setColor(newColor(rgb));

}


publicvoidsetRGB(intr,intg,intb)...{

intrgb=(r<<16)|(g<<8)|b;

_g.setColor(newColor(rgb));

}


publicvoiddrawLine(intx1,inty1,intx2,inty2,intrgb)...{

setRGB(rgb);

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

}


publicvoiddrawRect(intx,inty,intwidth,intheight)...{
_g.drawRect(x,y,width,height);
}


publicvoiddrawRect(intx,inty,intwidth,intheight,intrgb)...{

setRGB(rgb);

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

}


publicvoidfillRect(intx,inty,intwidth,intheight)...{
_g.fillRect(x,y,width,height);
}


publicvoidfillRect(intx,inty,intwidth,intheight,intrgb)...{

setRGB(rgb);

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

}


publicvoidfillTriangle(intx1,inty1,intx2,inty2,intx3,inty3)...{


if(_g==null)...{
return;
}

Polygonp=newPolygon();

p.addPoint(x1,y1);
p.addPoint(x2,y2);
p.addPoint(x3,y3);

_g.fillPolygon(p);

}


publicvoiddrawImage(BaseImageimg,intx,inty)...{
_g.drawImage(img.getImage(),x,y,null);
}


publicintgetStringWidth(Stringstr)...{


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

FontMetricsfm=_g.getFontMetrics();

intw=0;

w=fm.stringWidth(str);

returnw;

}


publicintgetStringHeight(Stringstr)...{


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

FontMetricsfm=_g.getFontMetrics();

LineMetricslm=fm.getLineMetrics(str,_g);

inth=0;

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

returnh;

}


publicvoiddrawString(Stringstr,intx,inty)...{

y+=getStringHeight(str);

_g.drawString(str,x,y);

}


publicvoiddrawString(Stringstr,intx,inty,intrgb)...{

setRGB(rgb);

drawString(str,x,y);

}


publicGraphicsgetGraphics()...{
return_g;
}

}

Bitmap.java:(你没看错,偶就是在学M$……)
package
org.loon.framework.game.test.image;

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.image.BufferedImage;
import
java.awt.image.ColorModel;
import
java.awt.image.ComponentColorModel;
import
java.awt.image.DataBuffer;
import
java.awt.image.DataBufferByte;
import
java.awt.image.PixelGrabber;
import
java.awt.image.Raster;
import
java.awt.image.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,封装了image的相关操作,开发中……
*</p>
*<p>
*Copyright:Copyright(c)2007
*</p>
*<p>
*Company:LoonFramework
*</p>
*
*@authorchenpeng
*@email:ceponline@yahoo.com.cn
*@version0.1
*/

public
class
Bitmap
implements
Cloneable,BaseImage
...
{

byte_bitmapFileHeader[]=newbyte[14];


byte_bfType[]=...{'B','M'};

int_bfReserved1=0;

int_bfReserved2=0;

int_bfOffBits=BITMAPFILEHEADER_SIZE+BITMAPINFOHEADER_SIZE;

byte_bitmapInfoHeader[]=newbyte[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;

privateBufferedImage_img;

privateLGraphics_g;

privateBufferedImage_back;

privateGraphics2D_bg;


/***//**
*将byte[]转为image
*
*@parambytes
*@return
*/

publicImagegetImage(byte[]bytes)...{
returnToolkit.getDefaultToolkit().createImage(bytes);
}


/***//**
*获得BufferedImage
*
*@paramwidth
*@paramheight
*@paramdata
*@return
*/

publicBufferedImagegetBufferedImage(intwidth,intheight,byte[]data)...{
DataBufferbuffer=newDataBufferByte(data,width*height);
intpixelStride=4;
intscanlineStride=4*width;

int[]bandOffsets=...{0,1,2};
WritableRasterraster=Raster.createInterleavedRaster(buffer,width,
height,scanlineStride,pixelStride,bandOffsets,null);
ColorSpacecolorSpace=ColorSpace.getInstance(ColorSpace.CS_sRGB);
booleanhasAlpha=false;
booleanisAlphaPremultiplied=false;
inttransparency=Transparency.OPAQUE;
inttransferType=DataBuffer.TYPE_BYTE;
ColorModelcolorModel=newComponentColorModel(colorSpace,hasAlpha,
isAlphaPremultiplied,transparency,transferType);
returnnewBufferedImage(colorModel,raster,isAlphaPremultiplied,null);
}


/***//**
*生成指定宽与高的空白图像。
*
*@paramwidth
*@paramheight
*/

publicBitmap(intwidth,intheight)...{


try...{
_img=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB);

}catch(Exceptione)...{
_img=null;
}


if(_img!=null)...{

_g=newLGraphics();
_g.setGraphics(_img.createGraphics());


}else...{
_g=null;
}


try...{
_back=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB);

}catch(Exceptione)...{
_back=null;
}


if(_back!=null)...{
_bg=_back.createGraphics();

}else...{
_bg=null;
}

}


/***//**
*追踪载入图像的实例
*
*@paramimage
*/

finalprivatevoidtrackerImage(Imageimage)...{
MediaTrackermediaTracker=newMediaTracker(newContainer());
mediaTracker.addImage(image,0);

try...{
mediaTracker.waitForID(0);

}catch(InterruptedExceptione)...{
e.printStackTrace();
}

}


/***//**
*以pixels构造bitmap
*
*@paramwidth
*@paramheight
*@parampixels
*/

publicBitmap(intwidth,intheight,int[]pixels)...{


try...{
_img=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB);

}catch(Exceptione)...{
_img=null;
}


if(_img!=null)...{

_g=newLGraphics();

_g.setGraphics(_img.getGraphics());


}else...{
_g=null;
}


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


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

for(intj=0;j<width;j++)...{
setPixel(j,i,pixels[j+i*width]);
}
}


try...{
_back=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB);

}catch(Exceptione)...{
_back=null;
}


if(_back!=null)...{
_bg=_back.createGraphics();

}else...{
_bg=null;
}

}


/***//**
*以指定路径载入bitmap
*
*@parampath
*/

publicBitmap(Stringpath)...{
this(getDataSource(path));
}


/***//**
*以inputstream载入bitmap
*
*@paraminputstream
*/

publicBitmap(InputStreaminputstream)...{
this(getDataSource(inputstream));
}


/***//**
*将byte[]转为bitmap
*
*@paramdata
*/

publicBitmap(byte[]data)...{
this(Toolkit.getDefaultToolkit().createImage(data));
}


/***//**
*将image直接注入bitmap
*
*@paramdata
*/

publicBitmap(Imageimage)...{

try...{
_img=getBufferedImage(image);

}catch(Exceptione)...{
_img=null;
}

if(_img!=null)...{
_g=newLGraphics();
_g.setGraphics(_img.createGraphics());


try...{
_back=newBufferedImage(_img.getWidth(),_img.getHeight(),
BufferedImage.TYPE_INT_RGB);

}catch(Exceptione)...{
_back=null;
}

if(_back!=null)...{
_bg=_back.createGraphics();

}else...{
_bg=null;
}


}else...{
_g=null;
}

}


/***//**
*通过物理路径获得byte[]
*
*@paramname
*@return
*/

finalstaticprivatebyte[]getDataSource(Stringname)...{
FileInputStreamfileInput;

try...{
fileInput=newFileInputStream(newFile(name));

}catch(FileNotFoundExceptione)...{
fileInput=null;
}
BufferedInputStreambufferedInput=newBufferedInputStream(fileInput);
returngetDataSource(bufferedInput);
}


/***//**
*将image转为BufferedImage
*
*@paramimage
*@return
*/

publicBufferedImagegetBufferedImage(Imageimage)...{
trackerImage(image);
intwidth=image.getWidth(null);
intheight=image.getHeight(null);
BufferedImagebufferedimage=newBufferedImage(width,height,
BufferedImage.TYPE_INT_RGB);
Graphicsg=bufferedimage.getGraphics();
g.drawImage(image,0,0,null);
returnbufferedimage;
}


/***//**
*通过InputStream获得byte[]
*
*@paramis
*@return
*/

finalstaticprivatebyte[]getDataSource(InputStreamis)...{

if(is==null)...{
returnnull;
}
ByteArrayOutputStreambyteArrayOutputStream=newByteArrayOutputStream();
byte[]arrayByte=null;

try...{
byte[]bytes=newbyte[4096];
bytes=newbyte[is.available()];
intread;

while((read=is.read(bytes))>=0)...{
byteArrayOutputStream.write(bytes,0,read);
}
arrayByte=byteArrayOutputStream.toByteArray();

}catch(IOExceptione)...{
returnnull;

}finally...{

try...{

if(byteArrayOutputStream!=null)...{
byteArrayOutputStream.close();
byteArrayOutputStream=null;
}

if(is!=null)...{
is.close();
is=null;
}


}catch(IOExceptione)...{
}
}
//返回byte[]
returnarrayByte;
}


/***//**
*获得图像宽
*/

publicintgetWidth()...{


if(_img==null)...{
return0;
}

return_img.getWidth();

}


/***//**
*获得图像高
*/

publicintgetHeight()...{


if(_img==null)...{
return0;
}

return_img.getHeight();

}


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

publicLColorgetPixel(intx,inty)...{
if(_img==null||x<0||x>=getWidth()||y<0

||y>=getHeight())...{
returnnull;
}
intc=_img.getRGB(x,y);
LColorcolor=newLColor();
color.R=(c&0x00ff0000)>>16;
color.G=(c&0x0000ff00)>>8;
color.B=c&0x000000ff;
returncolor;
}


/***//**
*返回image实例
*/

publicImagegetImage()...{
return_img;
}


/***//**
*返回Graphics
*/

publicLGraphicsgetLGraphics()...{
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())...{
returnfalse;
}

_img.setRGB(x,y,rgb);

returntrue;

}


/***/
/**
*设定指定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())...{
returnfalse;
}

intrgb=(r<<16)|(g<<8)|b;

_img.setRGB(x,y,rgb);

returntrue;

}


/***/
/**
*设定指定x,y交集处color
*
*@paramx
*@paramy
*@paramcolor
*@return
*/

public
boolean
setPixel(
int
x,
int
y,LColorcolor)
...
{
if(_img==null||x<0||x>=getWidth()||y<0

||y>=getHeight())...{
returnfalse;
}
intrgb=(color.R<<16)|(color.G<<8)|color.B;
_img.setRGB(x,y,rgb);
returntrue;
}


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

public
boolean
setTransparent(
int
x,
int
y)
...
{
if(_img==null||x<0||x>=getWidth()||y<0

||y>=getHeight())...{
returnfalse;
}
_img.setRGB(x,y,0x00000000);
returntrue;

}


/***/
/**
*设定整个Bitmap的透明度
*
*@paramd
*/

public
void
setScaleTransform(
double
d)
...
{
intwidth=getWidth();
intheight=getHeight();
BufferedImageback=null;
Graphicsbottom=null;
Imagescreen=null;
Graphicsgb=null;

try...{
back=newBufferedImage(width,height,2);
bottom=back.getGraphics();
screen=newBufferedImage(width,height,1);
gb=screen.getGraphics();
AlphaCompositealphacomposite=AlphaComposite.getInstance(3,
(float)d);
((Graphics2D)gb).setComposite(alphacomposite);
gb.drawImage(_img,0,0,null);
bottom.drawImage(screen,0,0,null);
_img=back;

}catch(Exceptionex)...{


}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;
}
}

}


/***/
/**
*设定image中指定color数值
*/

public
void
setTransparent(LColorcolor)
...
{

WritableRasterwr=_img.getRaster();
intwidth=getWidth();
intheight=getHeight();

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

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

for(intj=0;j<height;j++)...{
intc=_img.getRGB(i,j);
LColorcr=newLColor();
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);
}
}
}
}


/***/
/**
*替换指定颜色
*
*@paramcolor1
*@paramcolor2
*/

public
void
setDisplace(LColorcolor1,LColorcolor2)
...
{
WritableRasterwr=_img.getRaster();
intwidth=getWidth();
intheight=getHeight();

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

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

for(inty=0;y<height;y++)...{
intc=_img.getRGB(x,y);
LColorcr=newLColor();
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))...{
intrgb=(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
Objectclone()
throws
CloneNotSupportedException
...
{
return(Bitmap)super.clone();
}


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

final
private
BMPSaveBMP()
...
{
returnnewBMPSave();
}


/***/
/**
*保存自身到指定路径
*
*@parampath
*/

public
void
save(Stringpath)
...
{
this.BMP().saveBitmap(path,_img,_img.getWidth(null),
_img.getHeight(null));
}


/***/
/**
*保存图像到指定路径
*
*@paramimage
*@parampath
*/

public
void
save(Imageimage,Stringpath)
...
{
this.BMP().saveBitmap(path,image,image.getWidth(null),
image.getHeight(null));
}


/***/
/**
*保存图像到指定路径为指定大小
*
*@paramimage
*@parampath
*@paramwidth
*@paramheight
*/

public
void
save(Imageimage,Stringpath,
int
width,
int
height)
...
{
this.BMP().saveBitmap(path,image,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
...
{


/***//**
*
*/
privatestaticfinallongserialVersionUID=1L;


/***//**
*仅限此类内部使用
*
*/

privateBMPSave()...{
}

publicvoidsaveBitmap(StringparFilename,ImageparImage,

intparWidth,intparHeight)...{

try...{
_output=newFileOutputStream(parFilename);
save(parImage,parWidth,parHeight);
_output.close();

}catch(ExceptionsaveEx)...{
saveEx.printStackTrace();
}
}


privatevoidsave(ImageparImage,intparWidth,intparHeight)...{

try...{
convertImage(parImage,parWidth,parHeight);
writeBitmapFileHeader();
writeBitmapInfoHeader();
writeBitmap();

}catch(ExceptionsaveEx)...{
saveEx.printStackTrace();
}
}


privatebooleanconvertImage(ImageparImage,intparWidth,intparHeight)...{
intpad;
_bitmap=newint[parWidth*parHeight];
PixelGrabberpg=newPixelGrabber(parImage,0,0,parWidth,
parHeight,_bitmap,0,parWidth);

try...{
pg.grabPixels();

}catch(InterruptedExceptione)...{
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);
}


privatevoidwriteBitmap()...{
intsize;
intvalue;
intj;
inti;
introwCount;
introwIndex;
intlastRowIndex;
intpad;
intpadCount;
bytergb[]=newbyte[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(Exceptionwb)...{
wb.printStackTrace();
}
}


privatevoidwriteBitmapFileHeader()...{

try...{
_output.write(_bfType);
_output.write(intToDWord(_bfSize));
_output.write(intToWord(_bfReserved1));
_output.write(intToWord(_bfReserved2));
_output.write(intToDWord(_bfOffBits));

}catch(Exceptionwbfh)...{
wbfh.printStackTrace();
}
}


privatevoidwriteBitmapInfoHeader()...{

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(Exceptionwbih)...{
wbih.printStackTrace();
}
}


privatebyte[]intToWord(intparValue)...{
byteretValue[]=newbyte[2];
retValue[0]=(byte)(parValue&0x00FF);
retValue[1]=(byte)((parValue>>8)&0x00FF);
return(retValue);
}


privatebyte[]intToDWord(intparValue)...{
byteretValue[]=newbyte[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.image;

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>
*
*@authorchenpeng
*@email:ceponline@yahoo.com.cn
*@version0.1
*/


public
class
MyPanel
extends
Panel
...
{


/***//**
*
*/
privatestaticfinallongserialVersionUID=1L;

Bitmap_bitmap=null;


publicMyPanel(Bitmapbitmap)...{

_bitmap=bitmap;

setLayout(null);

setBackground(Color.BLACK);
}


publicvoidpaint(Graphicsg)...{

//加载原始图
g.drawImage(_bitmap.getImage(),0,0,this);
//图像间隔
intspace=2;
//加载loonframeworkcolor
LColorcolor=newLColor();
//产生随机数
Randomrand=newRandom();
//偏移度
intoffset=3;

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

for(intj=0;j<_bitmap.getHeight()-offset;j++)...{
//产生随机颗粒
inta=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);

}


publicstaticvoidmain(String[]args)...{

Framefrm=newFrame("Java油画效果(本示例由Loonframework框架提供)");
frm.setSize(600,364);
frm.setResizable(false);
frm.add(newMyPanel(newBitmap("c:/cc0.jpg")));
frm.setVisible(true);

}

}
而在我Blog发表评论的,只要是用人类语言,我都可以接受。就算有个别不用人类语言的,有空时我也会尽量帮那些生物往人类语言方向矫正。
——————————————————————————————
我们都知道,微软对其原有GDI(Graphics Device Interface)改进后形成了现在的GDI+。作为图形设备接口GDI的继任者,其对GDI的很多功能都进行了优化,而且还提供了许多方便实用的附加功能。
以此为基础,在.Net环境下可以很轻松的完成一系列复杂的图形操作。而与之相较,Java的图像接口在图像处理功能上则略显单薄,而部分操作较之C#等还有些复杂。
所以最近我打算在本人的loonframework项目中将一些java图像接口二次封装,及添加部分新的功能进入。下面我公布的,是一些在Loonframework框架中将新添加的图像处理类。当然,这些还在测试阶段,最后的确定版估计会与此有较大出入,有改进意见的欢迎邮寄到我的Email:ceponline@yahoo.com.cn。(最近挺懒的……一写代码就犯困……下班只看漫画度日……)
BaseImage.java:







































































































































LColor.java:




































LGraphics:































































































































































































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
























































































































































































































































































































































































































































































































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



















































































































































































































































































































































































































































































先保存一下再继续……
使用示例,实现了一个图形的油画效果:



























































































原图:
示例效果图: