Java 图片追加图片或者文字等

关于jpeg格式的图片追加图片或者文字等的简单例子

这里以JPEG为例子,因为sun的jdk里面有jpeg的编码,而对于gif/89gif,png等格式需要自己写编码程序,暂时先不介绍。

基本原理都是一样的, 首先把目标图片读到缓存里面构成一个缓存图片,然后获得这个图片的Graphics,有了Graphics 你想画啥就画啥啊,然后编码输出就可以了啊。

以下是简单的代码。
//目标文件

File input = new File("D:/cnjbb_banner.jpg");
String output = "D:/photo/jpeg/";
try
{
InputStream imageStream= new FileInputStream(input);
JPEGImageDecoder decoderFile= JPEGCodec.createJPEGDecoder(imageStream);
BufferedImage imageFile= decoderFile.decodeAsBufferedImage();
Graphics g= imageFile.getGraphics();
g.setColor(Color.WHITE);
g.setFont(new Font("Arial", Font.BOLD + Font.ITALIC, 22));
g.drawString("www.CnJBB.Org", 10, 20);
FileOutputStream jpgFile= new FileOutputStream(output+input.getName());
JPEGImageEncoderImpl jpeg= new JPEGImageEncoderImpl(jpgFile);
jpeg.encode(imageFile);
jpgFile.close();
imageStream.close();
}catch (Exception e)
{}

如果要追加一个小图片应该调用Graphics.drawImage();当然你想把图标放到什么位置,你要判断 目标图片的宽,高,和你图标的宽高。

gif的稍微复杂一些,因为除了编码外,gif还可能是动画,动画有针的概念,帧之间还有时间的间隔,这个以后介绍.

Java中获得文件类型

有时候我们需要确定一个文件的实际类型.以下举例以图片格式为例.
最常见的就是根据文件的扩展名来判断类型了,比如扩展名是”jpg”我们认为他的类型是”image/jpeg”
等等.

如果是httpurl的文件我们还可以根据xxx.getContentType();(xxx.getPropertye(“Content-type”))来活得文件的类型;
如果是本地物理路径的文件也可以虚拟一个java.net.URL,然后根据URLConnection来获得文件的类型.

如果有人故意改变文件的扩展名呢?
如: a.jpg他就改成a.gif的呢?

显然根据扩展名判断肯定是错误的了,经过测试根据URL也一样是错误的.

对于在手机上应用,或者我们在做图片合成(在一个图片上追加一个图片或者文字)的时候,对于每一种图片的编码是不一样的,我们必须得到准确文件格式.

在网上找了很多资料,后来lhelper告诉我一个地址http://filext.com 在这里记录了目前决大部分常用文件的格式类型.截至到2004-07-15,FILExt 中已经有了16828 条记录;你甚至可以通过FILExt 的blog 向FILExt 的库中添加你所掌握的某种新型文件的相关信息。

下面是从FILExt 中查到的另外几种常见图片的文件(bmp、jpeg、png、tiff)标识信息。
—————————-
image/gif
image/x-xbitmap
image/gi_
Hex: 47 49 46 38
ASCII: GIF8
or for GIF87a…
Hex: 47 49 46 38 37 61
ASCII: GIF87a
or for GIF89a…
……………………….
Hex: 47 49 46 38 39 61
ASCII: GIF89a
—————————-

—————————-
image/jpeg
image/jpg
image/jp_
application/jpg
application/x-jpg
image/pjpeg
image/pipeg
image/vnd.swiftview-jpeg
image/x-xbitmap
……………………….
Hex: FF D8 FF
ASCII:
—————————-

—————————-
image/bmp
image/x-bmp
image/x-bitmap
image/x-xbitmap
image/x-win-bitmap
image/x-windows-bmp
image/ms-bmp
image/x-ms-bmp
application/bmp
application/x-bmp
application/x-win-bitmap
application/preview
……………………….
Hex: 42 4D
ASCII: BM
—————————-

—————————-
image/png
application/png
application/x-png
……………………….
Hex: 89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52
ASCII: .PNG……..IHDR
—————————-

—————————-
image/tif
image/x-tif
image/tiff
image/x-tiff
application/tif
application/x-tif
application/tiff
application/x-tiff
……………………….
Hex: 49 49 2A 00
ASCII:
—————————-

用java读入一个文件然后判断他的前多少个byte是否符合某一类型的数值就可以判断出文件的真实类型.

唯一缺点就是效率比较低,因为他要把这个文件读一遍.

你可以根据你不同的需要,选择不同的判断方式.

WebStart Swing 论坛客户端

两个月前由于想弄弄swing,给cnjbb论坛做了一个客户端版本。

客户端用swing实现ui界面 ,要求客户端安装webstart来运行此软件。

客户端和服务器端通讯采用xml数据格式进行交互。

客户端把封装好的xml数据通过HTTP协议提交到远程的servlet,远程的servlet根据命令的不同,解析xml字符,然后执行相关的命令。同时返回xml格式的信息。

前几天修改了一下机制,当客户端发送命令的时候,启动2个线程,一个线程在后端向远程发送数据,另一个线程在ui上显示一个等待的窗口,当处理命令的线程结束后,等待窗口关闭。

前段时间有很多朋友向我咨询关于webstart项目的发布,今天做一个整理。

以下文字绝对是原创,不经本人同一请勿转载。
假设你已经做好了自己的swing程序。
比如已经把swing程序大包成zhanglihai.jar
假设您当前使用的系统是Win32系统,并且配置好了java变量,以及安装了WebStart。
一、签字程序
首先把一下代码copy下来,在本地建立一个文件如:createKey.bat

keytool -genkey -keystore myKeystore -alias myself
keytool -selfcert -alias myself -keystore myKeystore 
keytool -list -keystore myKeystore

然后执行createKey.bat文件。如下界面:

按照上面的提示输入,记住你输入的密码,本例子中的密码是12345678。

执行完,dos窗口会自动关闭,在与createKey的同一目录下生成一个文件:myKeystore

copy此文件到zhanglihai.jar目录下,然后copy以下内容建立一个文件如:signjar.bat

jarsigner -keystore myKeystore zhanglihai.jar myself

到此为止签字的准备工作已经完成。

二、为jar包进行签字

如果您的swing工程中引入了其他的jar包,应该先把引用的所有jar包解开,然后按照java的package规范整理出一个目录。
然后把zhanglihai.jar也接开,严格按照java的package规范把以上两个class文件以及目录合并在一起,然后重新打包。
我通常是这样做的,把工程所引用的所有jar包解开,按照java的package规发整理好,放到一个目录下。然后用winrar打开
zhanglihai.rar然后把目标文件导入进入。然后保存退出。如下图(我导入的是jdom包,其实没有用的class都可以不导入进去以便减少jar的Size)。

如果先对zhanglihi.rar签字然后再导入所需要的jar就等于破坏了签字,我曾经尝试过用jb把所需要的jar包和我自己的程序打成一个
jar包,但是签字也失败。后来我就采用winrar的方法来处理。

接下来是对新的jar包签字了,执行signjar.bat,输入密码,本例子中的密码是 12345678。
到此jar的签字结束。

三、工程的部署

WebStar工程要求有服务器端支持JNLP配置,一般的servlet引擎都支持这种类型。如果不支持,你可以在你的web.xml里面加入如下代码.

   <mime-mapping>
        <extension>class</extension>
        <mime-type>application/java</mime-type>
    </mime-mapping>    
    <mime-mapping>
        <extension>jar</extension>
        <mime-type>application/java-archive</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>jnlp</extension>
        <mime-type>application/x-java-jnlp-file</mime-type>
    </mime-mapping>

然后我们建立jnlp文件如:zhanglihai.jnlp
如下代码:

 
<?xml version="1.0" encoding="utf-8"?> 
<!-- JNLP File for SwingSet2 Demo Application --> 
<!--
codebase:是以下文件的一个根URL,所有的文件都是从这个路径算起的。
以下文件中还有几个是webstart启动时候的图标以及工程标题,工程描述
-->
<jnlp 
  spec="1.0+" 
  codebase="http://localhost:9090/cnjbb/swing"  href="zhanglihai.jnlp"> 
  <information> 
    <title>CnJBB论坛桌面应用程序 </title> 
    <vendor>ZhangLiHai.Com</vendor> 
   <description>CnJBB论坛桌面应用程序</description> 
    <description kind="short">CnJBB论坛桌面应用程序</description> 
    <icon href="cnjbbicon.gif"/>
    <icon kind="splash" href="cnjbbicon.gif"/> 
    <offline-allowed/> 
  </information> 
  <security> 
      <all-permissions/> 
  </security> 
  <resources> 
    <j2se version="1.4+" href="http://localhost:9090/cnjbb/swing"/>
    <j2se version="1.4+"/>
    <jar href="zhanglihai.jar" main="true" />
  </resources> 
  <!--
  jar包中main函数的类全路径名
  -->
  <application-desc main-class="org.cnjbb.client.WebDesktop"/>
  <!--
    <applet-desc 
      documentBase="http://localhost:9090/cnjbb/swing/" 
      name="WebDesktop" 
      main-class="org.cnjbb.client.WebDesktop" 
      width="600" 
      height="500"> 
   </applet-desc> 
   -->
</jnlp>

然后建立一个index.html文件如下:

<html>
 <head>
 <SCRIPT LANGUAGE="JavaScript"> 
          var javawsInstalled = 0; 
          isIE = "false";
 
          if (navigator.mimeTypes && navigator.mimeTypes.length) { 
             x = navigator.mimeTypes['application/x-java-jnlp-file']; 
             if (x) javawsInstalled = 1; 
          } else { 
             isIE = "true"; 
          } 
          function insertLink(url, name) { 
          if (javawsInstalled || navigator.family == 'gecko') { 
                document.write("<a href=" + url + ">"  + name + "</a>"); 
             } else { 
               document.write("<a href=http://dlres.java.sun.com/PluginBrowserCheck?pass=http://www.cnjbb.org/swing/index.html&fail=http://java.sun.com/cgi-bin/javawebstart-platform.sh>点这里下在并且安装WebStart</a> ");
             } 
          } 
      </SCRIPT> 
      <SCRIPT LANGUAGE="VBScript"> 
          on error resume next 
          If isIE = "true" Then 
            If Not(IsObject(CreateObject("JavaWebStart.IsInstalled"))) Then 
                  javawsInstalled = 0 
            Else 
                  javawsInstalled = 1 
            End If 
          End If 
      </SCRIPT> 
  </head>
  <body >
  <h1>欢迎使用CnJBB论坛客户端版本,如果您的机器上没有安装webstart请点下面的连接下在并安装!</h1>
    <SCRIPT LANGUAGE="Javascript"> 
        <!-- 
        insertLink("zhanglihai.jnlp","CnJBB Swing DownLoad"); 
        // --> 
    </SCRIPT> 
  </body>
  </html>

这段脚本会自动检测机器上是否安装webstar,如果没有安装就提示安装。

启动Servlet引擎,至此webstart工程发布完毕。

询问是否启动,情选择“是”。图中的例子是我用ZhangLiHai做的签字,因为本地程序的原因,我调用远程的程序测试的。

预览地址:http://www.cnjbb.org/swing/