java技术研究

统计

留言簿(3)

阅读排行榜

评论排行榜

#

将白色背景图片变透明(转自csdn)

     摘要: [java:showcolumns] view plaincopy·········10········20········30·...  阅读全文

posted @ 2012-04-28 09:50 小秦 阅读(1391) | 评论 (0)编辑 收藏

Java数字图像处理基础知识 - 必读(转自javaeye)



 

写了很多篇关于图像处理的文章,没有一篇介绍Java 2D的图像处理API,文章讨论和提及的

API都是基于JDK6的,首先来看Java中如何组织一个图像对象BufferedImage的,如图:


一个BufferedImage的像素数据储存在Raster中,ColorModel里面储存颜色空间,类型等

信息,当前Java只支持一下三种图像格式- JPG,PNG,GIF,如何向让Java支持其它格式,首

先要 完成Java中的图像读写接口,然后打成jar,加上启动参数- Xbootclasspath/p

newimageformatIO.jar即可。

 

Java中如何读写一个图像文件,使用ImageIO对象即可。读图像文件的代码如下:

 

  1. File file = new File("D:\\test\\blue_flower.jpg");  
  2. BufferedImage image = ImageIO.read(file);  

 

写图像文件的代码如下:

 

  1. File outputfile = new File("saved.png");  
  2. ImageIO.write(bufferedImage, "png",outputfile);  

 

从BufferedImage对象中读取像素数据的代码如下:

  1. int type= image.getType();  
  2. if ( type ==BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB )  
  3.      return (int [])image.getRaster().getDataElements(x, y, width, height, pixels );  
  4. else  
  5.     return image.getRGB( x, y, width, height, pixels, 0, width );  

 

首先获取图像类型,如果不是32位的INT型数据,直接读写RGB值即可,否则需要从Raster

对象中读取。

 

往BufferedImage对象中写入像素数据同样遵守上面的规则。代码如下:

 

  1. int type= image.getType();  
  2. if ( type ==BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB )  
  3.    image.getRaster().setDataElements(x, y, width, height, pixels );  
  4. else  
  5.    image.setRGB(x, y, width, height, pixels, 0, width );  


 

读取图像可能因为图像文件比较大,需要一定时间的等待才可以,Java Advance Image

Processor API提供了MediaTracker对象来跟踪图像的加载,同步其它操作,使用方法如下:

  1. MediaTracker tracker = new MediaTracker(this); //初始化对象  
  2. tracker.addImage(image_01, 1); // 加入要跟踪的BufferedImage对象image_001  
  3. tracker.waitForID(110000) // 等待10秒,让iamge_01图像加载  

 

从一个32位int型数据cARGB中读取图像RGB颜色值的代码如下:

 

  1. int alpha = (cARGB >> 24)& 0xff; //透明度通道  
  2. int red = (cARGB >> 16) &0xff;  
  3. int green = (cARGB >> 8) &0xff;  
  4. int blue = cARGB & 0xff;  

 

将RGB颜色值写入成一个INT型数据cRGB的代码如下:

 

  1. cRGB = (alpha << 24) | (red<< 16) | (green << 8) | blue;  

 

创建一个BufferedImage对象的代码如下:

 

  1. BufferedImage image = newBufferedImage(256256, BufferedImage.TYPE_INT_ARGB);  

 

一个完整的源代码Demo如下:

 

  1. package com.gloomyfish.swing;  
  2.   
  3. import java.awt.BorderLayout;  
  4. import java.awt.Dimension;  
  5. import java.awt.Graphics;  
  6. import java.awt.Graphics2D;  
  7. import java.awt.RenderingHints;  
  8. import java.awt.image.BufferedImage;  
  9. import java.io.File;  
  10. import java.io.IOException;  
  11.   
  12. import javax.imageio.ImageIO;  
  13. import javax.swing.JComponent;  
  14. import javax.swing.JFrame;  
  15.   
  16. public class PlasmaDemo extends JComponent {    
  17.     
  18.     /**  
  19.      *   
  20.      */    
  21.     private static final long serialVersionUID = -2236160343614397287L;    
  22.     private BufferedImage image = null;    
  23.     private int size = 256;  
  24.         
  25.     public PlasmaDemo() {    
  26.         super();    
  27.         this.setOpaque(false);    
  28.     }    
  29.         
  30.     protected void paintComponent(Graphics g) {    
  31.         Graphics2D g2 = (Graphics2D)g;    
  32.         g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);    
  33.         g2.drawImage(getImage(), 55, image.getWidth(), image.getHeight(), null);    
  34.     }    
  35.         
  36.     private BufferedImage getImage() {    
  37.         if(image == null) {    
  38.             image = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB);    
  39.             int[] rgbData = new int[size*size];    
  40.             generateNoiseImage(rgbData);    
  41.             setRGB(image, 00, size, size, rgbData);  
  42.             File outFile = new File("plasma.jpg");  
  43.             try {  
  44.                 ImageIO.write(image, "jpg", outFile);  
  45.             } catch (IOException e) {  
  46.                 e.printStackTrace();  
  47.             }  
  48.         }    
  49.         return image;    
  50.     }    
  51.         
  52.     public void generateNoiseImage(int[] rgbData) {    
  53.         int index = 0;    
  54.         int a = 255;    
  55.         int r = 0;    
  56.         int g = 0;    
  57.         int b = 0;    
  58.    
  59.         for(int row=0; row<size; row++) {    
  60.             for(int col=0; col<size; col++) {    
  61.                 // set random color value for each pixel    
  62.                 r = (int)(128.0 + (128.0 * Math.sin((row + col) / 8.0)));    
  63.                 g = (int)(128.0 + (128.0 * Math.sin((row + col) / 8.0)));    
  64.                 b = (int)(128.0 + (128.0 * Math.sin((row + col) / 8.0)));    
  65.                     
  66.                 rgbData[index] = ((clamp(a) & 0xff) << 24) |    
  67.                                 ((clamp(r) & 0xff) << 16)  |    
  68.                                 ((clamp(g) & 0xff) << 8)   |    
  69.                                 ((clamp(b) & 0xff));    
  70.                 index++;    
  71.             }    
  72.         }    
  73.             
  74.     }    
  75.         
  76.     private int clamp(int rgb) {    
  77.         if(rgb > 255)    
  78.             return 255;    
  79.         if(rgb < 0)    
  80.             return 0;    
  81.         return rgb;    
  82.     }      
  83.     
  84.     public void setRGB( BufferedImage image, int x, int y, int width, int height, int[] pixels ) {    
  85.         int type = image.getType();    
  86.         if ( type == BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB )    
  87.             image.getRaster().setDataElements( x, y, width, height, pixels );    
  88.         else    
  89.             image.setRGB( x, y, width, height, pixels, 0, width );    
  90.     }    
  91.         
  92.     public static void main(String[] args) {    
  93.         JFrame frame = new JFrame("Noise Art Panel");    
  94.         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    
  95.         frame.getContentPane().setLayout(new BorderLayout());    
  96.             
  97.         // Display the window.    
  98.         frame.getContentPane().add(new PlasmaDemo(), BorderLayout.CENTER);    
  99.         frame.setPreferredSize(new Dimension(400 + 25,450));    
  100.         frame.pack();    
  101.         frame.setVisible(true);    
  102.     }    
  103. }    

 

posted @ 2012-04-26 16:56 小秦 阅读(712) | 评论 (0)编辑 收藏

【转】windows下mysql日志开启与查询

修改 my.ini文件
加入以下语句(在没有设置的前提下)
log-error=d:/log/mysql/mysql_log_err.txt
log=d:/log/mysql/mysql_log.txt
#log-bin=d:/log/mysql/mysql_log_bin
log-slow-queries= d:/log/mysql/mysql_log_slow.txt

使用以下命令查看是否启用了日志

mysql>show variables like ’log_%’;

其他:
参考:http://www.phpfans.net/article/htmls/201008/MjkzMTE0.html

1.
错误日志 记录启动、运行或停止mysqld时出现的问题。
My.ini配置信息:
#Enter a name for the error log file. Otherwise a default name will be used.
#log-error=d:/mysql_log_err.txt
2.
查询日志 记录建立的客户端连接和执行的语句。
My.ini配置信息:
#Enter a name for the query log file. Otherwise a default name will be used.
#log=d:/mysql_log.txt
3.
更新日志 记录更改数据的语句。不赞成使用该日志。
My.ini配置信息:
#Enter a name for the update log file. Otherwise a default name will be used.
#log-update=d:/mysql_log_update.txt
4.
二进制日志 记录所有更改数据的语句。还用于复制。
My.ini配置信息:
#Enter a name for the binary log. Otherwise a default name will be used.
#log-bin=d:/mysql_log_bin
5.
慢日志 记录所有执行时间超过long_query_time秒的所有查询或不使用索引的查询。
My.ini配置信息:
#Enter a name for the slow query log file. Otherwise a default name will be used.
#long_query_time =1

#log-slow-queries= d:/mysql_log_slow.txt 

posted @ 2012-04-20 20:52 小秦 阅读(3801) | 评论 (0)编辑 收藏

Spring中Quartz定时程序执行两次(转)


请看下面这段配置就是错误的: 

<Host name="www.***.com" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> 
<Logger className="org.apache.catalina.logger.FileLogger" directory="logs" prefix="localhost_log." suffix=".txt" timestamp="true" /> 
<Context path="" docBase="/tomcat/webapps/***" debug="1" /> 
<Context path="/***2" docBase="/tomcat/webapps/***2" debug="1" /> 
</Host> 


正确的配置如下 

<Host name="www.***.com" debug="0" appBase="" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> 
<Logger className="org.apache.catalina.logger.FileLogger" directory="logs" prefix="localhost_log." suffix=".txt" timestamp="true" /> 
<Context path="" docBase="/tomcat/webapps/***" debug="1" /> 
<Context path="/***2" docBase="/tomcat/webapps/***2" debug="1" /> 
</Host> 
这两段的区别是第二段去除了appBase="webapps"中的webapps变成了appBase="",因为web应用程序都是放在 webapps这个目录下的,如果不把“webapps“去掉,这里会调用一次quartz的任务调度,在接下来的“<Context path”中又会调用一次quartz的任务调度,所以就重复了2次

posted @ 2012-04-20 16:45 小秦 阅读(1759) | 评论 (0)编辑 收藏

tomcat启动2次应用

tomcat中三种部署项目的方法
第一种方法:在tomcat中的conf目录中,在server.xml中的,<host/>节点中添加: 
<Context path="/hello" docBase="D:eclipse3.2.2forwebtoolsworkspacehelloWebRoot" debug="0" privileged="true"> 
</Context> 
至于Context 节点属性,可详细见相关文档。 
第二种方法:将web项目文件件拷贝到webapps 目录中。 
第三种方法:很灵活,在conf目录中,新建 Catalina(注意大小写)\localhost目录,在该目录中新建一个xml文件,名字可以随意取,只要和当前文件中的文件名不重复就行了,该xml文件的内容为: 
<Context path="/hello" docBase="D:eclipse3.2.2forwebtoolsworkspacehelloWebRoot" debug="0" privileged="true"> 
</Context> 
第3个方法有个优点,可以定义别名。服务器端运行的项目名称为path,外部访问的URL则使用XML的文件名。这个方法很方便的隐藏了项目的名称,对一些项目名称被固定不能更换,但外部访问时又想换个路径,非常有效。 
第2、3还有优点,可以定义一些个性配置,如数据源的配置等。 
还有一篇 详细的 
此处主要讲述Tomcat部署发布JSP应用程序的三种方法 
    1、直接放到Webapps目录下 
     Tomcat的Webapps目录是Tomcat默认的应用目录,当服务器启动时,会加载所有这个目录下的应用。也可以将JSP程序打包成一个 war包放在目录下,服务器会自动解开这个war包,并在这个目录下生成一个同名的文件夹。一个war包就是有特性格式的jar包,它是将一个Web程序的所有内容进行压缩得到。具体如何打包,可以使用许多开发工具的IDE环境,如Eclipse、NetBeans、ant、JBuilder等。也可以用 cmd 命令:jar -cvf applicationname.war package.*; 
甚至可以在程序执行中打包: 
try{ 
string strjavahome = system.getproperty("java.home"); 
strjavahome = strjavahome.substring(0,strjavahome.lastindexof(\\))+"\\bin\\"; 
runtime.getruntime().exec("cmd /c start "+strjavahome+"jar cvf hello.war c:\\tomcat5.0\\webapps\\root\\*"); 
}  
catch(exception e){system.out.println(e);} 
     webapps这个默认的应用目录也是可以改变。打开Tomcat的conf目录下的server.xml文件,找到下面内容: 
<Host name="localhost" debug="0" appBase="webapps" unpackWARs="true" autoDeloy="true" xmlValidation="falase" xmlNamespaceAware="false"> 
   2、在server.xml中指定 
     在Tomcat的配置文件中,一个Web应用就是一个特定的Context,可以通过在server.xml中新建Context里部署一个JSP应用程序。打开server.xml文件,在Host标签内建一个Context,内容如下。 
<Context path="/myapp" reloadable="true" docBase="D:\myapp" workDir="D:\myapp\work"/> 
     其中path是虚拟路径,docBase是JSP应用程序的物理路径,workDir是这个应用的工作目录,存放运行是生成的于这个应用相关的文件。 
   3、创建一个Context文件 
     以上两种方法,Web应用被服务器加载后都会在Tomcat的conf\catalina\localhost目录下生成一个XML文件,其内容如下: 
<Context path="/admin" docBase="${catalina.home}/server/webapps/admin" debug="0" privileged="true"></Context> 
可以看出,文件中描述一个应用程序的Context信息,其内容和server.xml中的Context信息格式是一致的,文件名便是虚拟目录名。您可以直接建立这样的一个xml文件,放在Tomcat的conf\catalina\localhost目录下。例子如下: 
注意:删除一个Web应用同时也要删除webapps下相应的文件夹祸server.xml中相应的Context,还要将Tomcat的conf 
\catalina\localhost目录下相应的xml文件删除。否则Tomcat仍会岸配置去加载。。。


所以项目最好不要放在webapps下,然后又跑去server.xml下或者catalina目录下再配置一遍,这样就会同时启动2次同一个应用。如果应用中有job,这样会造成并发。

posted @ 2012-04-20 16:36 小秦 阅读(2419) | 评论 (1)编辑 收藏

spring quartz使用多线程并发“陷阱”(转)

定义一个job:ranJob,设置每秒执行一次,设置不允许覆盖并发执行

 

Xml代码  
  1. <bean id="rankJob" class="com.chinacache.www.logstat.job.RankJob" />  
  2. <bean id="rankJobDetail"  
  3.     class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
  4.     <property name="targetObject" ref="rankJob" />  
  5.     <property name="targetMethod" value="execute" />  
  6.     <property name="concurrent" value="<span style="color: #ff0000;"><strong>false</strong></span>/>  
  7. </bean>  
  8. <bean id="rankJobTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">  
  9.     <property name="jobDetail" ref="rankJobDetail" />  
  10.     <!-- 单位 ms,半小时 1800000 ms -->  
  11.     <property name="repeatInterval" value="<span style="color: #ff0000;"><strong>1000</strong></span>/>  
  12. </bean>  

 

job代码:

Java代码  
  1. System.out.println("Start job");  
  2. ExecutorService exec = Executors.newFixedThreadPool(1);  
  3.   
  4. Thread thread = new Thread(new Runnable() {  
  5.     @Override  
  6.     public void run() {  
  7.         System.out.println("thread start");  
  8.         try {  
  9.             Thread.sleep(3000);  
  10.         } catch (InterruptedException e) {  
  11.             // TODO Auto-generated catch block  
  12.             e.printStackTrace();  
  13.         }  
  14.         System.out.println("thread end");  
  15.     }  
  16. });  
  17. exec.execute(thread);  
  18. System.out.println("end job");  

 

程序输出结果:

Java代码  
  1. Start job  
  2. end job  
  3. <span style="color: #ff0000;"><strong>thread start</strong></span>  
  4. Start job  
  5. end job  
  6. thread start  
  7. Start job  
  8. end job  
  9. thread start  
  10. Start job  
  11. end job  
  12. thread start  
  13. <strong><span style="color: #ff0000;">thread end</span></strong>  

 

从结果可以看到,job的并发覆盖配置似乎根本没有生效,原因是:job没有关注多线程执行情况

修改job代码,添加如下代码在job访问最后,线程处理完job才结束,

 

Java代码  
  1. while (!exec.isTerminated()) {  
  2.     // 等待所有子线程结束,才退出主线程  
  3. }  

 

修改代码后程序结果:

Java代码  
  1. Start job  
  2. thread start  
  3. thread end  

 

可以看到job始终没有结束,说明ExecutorService始终没有终止,看看文档,加入shutdonw()方法,job所有代码如下:

Java代码  
  1. public void execute() throws InterruptedException {  
  2.     System.out.println("Start job");  
  3.     ExecutorService exec = Executors.newFixedThreadPool(1);  
  4.       
  5.     Thread thread = new Thread(new Runnable() {  
  6.         @Override  
  7.         public void run() {  
  8.             System.out.println("thread start");  
  9.             try {  
  10.                 Thread.sleep(3000);  
  11.             } catch (InterruptedException e) {  
  12.                 // TODO Auto-generated catch block  
  13.                 e.printStackTrace();  
  14.             }  
  15.             System.out.println("thread end");  
  16.         }  
  17.     });  
  18.     exec.execute(thread);  
  19.     exec.shutdown();  
  20.        while (!exec.isTerminated()) {  
  21.            // 等待所有子线程结束,才退出主线程  
  22.        }          
  23.     System.out.println("end job");  
  24. }  

 

打印结果如下:

 

Java代码  
  1. Start job  
  2. thread start  
  3. thread end  
  4. end job  
  5.   
  6. Start job  
  7. thread start  
  8. thread end  
  9. end job  
  10.   
  11. Start job  
  12. thread start  
  13. thread end  
  14. end job  

 

 

OK,至此spring quartz多线程并发问题解决。回顾下,我们要使用isTerminated()方法等多线程结束后在结束job;多线程任务派发结束后,要使用shutdown()方法顺序关闭线程(等待正在执行任务,不接受新任务)

posted @ 2012-04-19 14:15 小秦 阅读(8114) | 评论 (1)编辑 收藏

清除浮动引起的bug

<div class="clearLine"></div>
这段用来清除浮动
得要写在最下面,不可以写在两段div的中间,否则就会错位。

posted @ 2012-04-18 16:27 小秦 阅读(175) | 评论 (0)编辑 收藏

Spring+hibernate 配置quartz后,quartz执行的程序无法释放连接是什么原因?

有个bean命名不在指定的拦截范围内,没被事务拦截器拦截,所以没有关闭连接了。 
<bean id="mailEngine" parent="txProxyTemplate">
以前没有配置parent,所以不在spring的事务监管之列。

posted @ 2012-04-16 11:16 小秦 阅读(954) | 评论 (0)编辑 收藏

quartz多个线程同时处理一条记录的问题。

因为当save时,会出错就表示锁了。
比如下面的方法,要catch一下,如果保存报错,就表示另一个线程保存的时候锁住了。
public List<MailQueue> updateStatusAndFindMailList(int numOfEmailsPerTime) {
List<MailQueue> list = this.mailQueueDao.findMailListAndLock(numOfEmailsPerTime);
for(MailQueue mailQueue:list){
try{
mailQueue.setSendStatus(MailQueue.STATUS_SENDING);
this.saveOrUpdate(mailQueue);
}catch(Exception e){
//如果保存失败,表示是给另一个线程保存了。
list.remove(mailQueue);
}
}
return list;
}

posted @ 2012-04-12 13:18 小秦 阅读(532) | 评论 (0)编辑 收藏

filter与redirect引起的 IllegalStateException问题

在response.sendRedirect()方法后加return语句即可,如下:
response.sendRedirect("index.jsp");
return;

原因是:在程序中两次调用了response.sendRedirect()方法。

jdk5.0文档中很清楚地介绍了出现IllegalStateException异常的可能情况:

1)同一个页面中再次调用response.sendRedirect()方法。
2)提交的URL错误,即不是个有效的URL。

filter中多次chain.doFilter(request, response);也会这样,要保证一个filter只进行一次doFilter

java.lang.IllegalStateException
at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:405)
at org.apache.catalina.servlets.DefaultServlet.serveResource(DefaultServlet.java:779)
at org.apache.catalina.servlets.DefaultServlet.doGet(DefaultServlet.java:385)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:627)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at com.ebizer.framework.star.filter.CoreUrlRewriteFilter.doFilterInternal(CoreUrlRewriteFilter.java:120)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:581)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:843)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:679)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1293)
at java.lang.Thread.run(Thread.java:595)

posted @ 2012-04-11 12:00 小秦 阅读(1759) | 评论 (0)编辑 收藏

仅列出标题
共11页: First 上一页 3 4 5 6 7 8 9 10 11 下一页