求一份 Java log4j 详细配置 以及ImageMagick的用法 还有获取系统变量方法最好多一些资料

解决方案 »

  1.   

    这个 log4j.xml 足够你使用了:<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"><log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"
      threshold="debug">  <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
        <param name="Target" value="System.out" />
        <layout class="org.apache.log4j.PatternLayout">
          <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%t] [%c{1}] %m%n" />
        </layout>
      </appender>
      
      <appender name="ASYNC_CONSOLE" class="org.apache.log4j.AsyncAppender">
        <param name="BufferSize" value="8192"/>
        <appender-ref ref="CONSOLE" />
      </appender>  <appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="/home/x/log/server.log" />
        <param name="Append" value="true" />
        <param name="DatePattern" value="'.'yyyy-MM-dd" />
        <layout class="org.apache.log4j.PatternLayout">
          <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%t] [%c{1}] %m%n" />
        </layout>
      </appender>  <logger name="com.test">
        <level value="DEBUG" />
      </logger>  <root>
        <level value="INFO" />
        <appender-ref ref="CONSOLE" />
      </root>
    </log4j:configuration>ImageMagick 的 API 上有很详细的说明,不过 ImageMagick 在 Linux 上安装有些麻烦。Java 获取环境变量,可以使用 System.getenv(name);
      

  2.   

    ImageMagick for java 使用Jmagick压缩高质量图片jmagick-win-6.3.9-Q16.zip在做pdf文档转成jpg的时候,发现了Jmagick的创建高质量的图片的一个java类库,自己以前使用另外的一个类库,感觉这个更好点,就试着用了下,感觉不错1.使用的windows下的jmagick-win-6.3.9-Q16.zip 地址是:http://downloads.jmagick.org/6.3.9/2.doc对应的api地址:http://downloads.jmagick.org/jmagick-doc/3.安装ImageMagick,官方网站:http://www.imagemagick.org/我使用的是:ImageMagick-6.4.6-4-Q16-windows-dll.exe :点击下载4. 安装ImageMagick-6.4.6-4-Q16-windows-dll.exe,将 安装目录下(按自己所安装的目录找) 下的所有dll文件 copy 到系统盘下的 “C:\WINDOWS\system32\”文件夹里5. 配置环境变量
    再环境变量path里添加新的值 “C:\Program Files\ImageMagick-6.4.6-4-Q16“使用IDE可以不用配置6.解压jmagick-win-6.3.9-Q16.zip
    将 jmagick.dll 复制到系统盘下的 “C:\WINDOWS\system32\”文件夹里 和 复制到jdk的bin(例“D:\jdk6\bin”)文件里各一份
    将 jmagick.jar 复制到Tomcat下的lib文件夹里 和 所使用项目的WEB-INF下lib文件里 各一份7.web应用如果部署到tomcat下,那么最好在catalina.bat文件中改变如下设置
    set JAVA_OPTS=%JAVA_OPTS% -Xms256M -Xmx768M -XX:MaxPermSize=128M – Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager – Djava.util.logging.config.file=”${catalina.base}\conf\logging.properties”
    避免heap溢出的问题,参数看你自己的机器而定。( -Xms256M -Xmx768M -XX:MaxPermSize=128M )8.还要注意如果部署到web应用,你在使用的class里面需要
    System.setProperty(“jmagick.systemclassloader”,”no”);
    要不然会报出UnsatisfiedLinkError: no JMagick in java.library.path.
    实例测试code:
    package com.utils;
     
    import magick.ImageInfo;
    import magick.MagickApiException;
    import magick.MagickException;
    import magick.MagickImage;
     
    public class Treamspdf {
     public static void main(String[] args) {
    resetsize("F:\\love.jsp","F:\\new.jpg"); //第一个参数是己存在的图片,第二个是处理好的图片位置  
    }
    public static void resetsize(String picFrom,String picTo){
    try{
    ImageInfo info=new ImageInfo(picFrom);
    MagickImage image=new MagickImage(new ImageInfo(picFrom));
    MagickImage scaled=image.scaleImage(120, 97);  //设置图片大小。
    scaled.setFileName(picTo);
    scaled.writeImage(info);
    }catch(MagickApiException ex){
    ex.printStackTrace();
    } catch(MagickException   ex)   {
    ex.printStackTrace();
    }
    }
    }
    注意 :如果 报JMagick in java.library.path(找不到jmagick路径),
    用System.out.println(System.getProperty("java.library.path")). 打印出当前环境的路径,然后再把jmagick.dll 复制到其中的一个路径文件夹中问题解决。常用的水印,切图,压缩等简单程序工具类,继续下面 我没有全用过,只是根据需求用哪一个。 package com.utils;   
     
    import java.awt.Dimension;
    import java.awt.Rectangle;
    import java.text.SimpleDateFormat;
    import java.util.Date;   
     
    import magick.CompositeOperator;
    import magick.CompressionType;
    import magick.DrawInfo;
    import magick.ImageInfo;
    import magick.MagickException;
    import magick.MagickImage;
    import magick.PixelPacket;
    import magick.PreviewType;   
     
    public class Aa {   
     
        static{
            //不能漏掉这个,不然jmagick.jar的路径找不到
            System.setProperty("jmagick.systemclassloader","no");
        }   
     
        /**
         * 压缩图片
         * @param filePath 源文件路径
         * @param toPath   缩略图路径
         */
        public static void createThumbnail(String filePath, String toPath) throws MagickException{
            ImageInfo info = null;
            MagickImage image = null;
            Dimension imageDim = null;
            MagickImage scaled = null;
            try{
                info = new ImageInfo(filePath);
                image = new MagickImage(info);
                imageDim = image.getDimension();
                int wideth = imageDim.width;
                int height = imageDim.height;
                if (wideth > height) {
                    height = 660 * height / wideth;
                    wideth = 660;
                }
                scaled = image.scaleImage(wideth, height);//小图片文件的大小.
                scaled.setFileName(toPath);
                scaled.writeImage(info);
            }finally{
                if(scaled != null){
                    scaled.destroyImages();
                }
            }
        }   
     
        /**
         * 水印(图片logo)
         * @param filePath  源文件路径
         * @param toImg     修改图路径
         * @param logoPath  logo图路径
         * @throws MagickException
         */
        public static void initLogoImg(String filePath, String toImg, String logoPath) throws MagickException {
            ImageInfo info = new ImageInfo();
            MagickImage fImage = null;
            MagickImage sImage = null;
            MagickImage fLogo = null;
            MagickImage sLogo = null;
            Dimension imageDim = null;
            Dimension logoDim = null;
            try {
                fImage = new MagickImage(new ImageInfo(filePath));
                imageDim = fImage.getDimension();
                int width = imageDim.width;
                int height = imageDim.height;
                if (width > 660) {
                    height = 660 * height / width;
                    width = 660;
                }
                sImage = fImage.scaleImage(width, height);   
     
                fLogo = new MagickImage(new ImageInfo(logoPath));
                logoDim = fLogo.getDimension();
                int lw = width / 8;
                int lh = logoDim.height * lw / logoDim.width;
                sLogo = fLogo.scaleImage(lw, lh);   
     
                sImage.compositeImage(CompositeOperator.AtopCompositeOp, sLogo,  width-(lw + lh/10), height-(lh + lh/10));
                sImage.setFileName(toImg);
                sImage.writeImage(info);
            } finally {
                if(sImage != null){
                    sImage.destroyImages();
                }
            }
        }   
     
        /**
         * 水印(文字)
            * @param filePath 源文件路径
         * @param toImg    修改图路径
         * @param text     名字(文字内容自己随意)
         * @throws MagickException
         */
        public static void initTextToImg(String filePath, String toImg,  String text) throws MagickException{
                ImageInfo info = new ImageInfo(filePath);
                if (filePath.toUpperCase().endsWith("JPG") || filePath.toUpperCase().endsWith("JPEG")) {
                    info.setCompression(CompressionType.JPEGCompression); //压缩类别为JPEG格式
                    info.setPreviewType(PreviewType.JPEGPreview); //预览格式为JPEG格式
                    info.setQuality(95);
                }
                MagickImage aImage = new MagickImage(info);
                Dimension imageDim = aImage.getDimension();
                int wideth = imageDim.width;
                int height = imageDim.height;
                if (wideth > 660) {
                    height = 660 * height / wideth;
                    wideth = 660;
                }
                int a = 0;
                int b = 0;
                String[] as = text.split("");
                for (String string : as) {
                    if(string.matches("[\u4E00-\u9FA5]")){
                        a++;
                    }
                    if(string.matches("[a-zA-Z0-9]")){
                        b++;
                    }
                }
                int tl = a*12 + b*6 + 300;
                MagickImage scaled = aImage.scaleImage(wideth, height);
                if(wideth > tl &#038;& height > 5){
                    DrawInfo aInfo = new DrawInfo(info);
                    aInfo.setFill(PixelPacket.queryColorDatabase("white"));
                    aInfo.setUnderColor(new PixelPacket(0,0,0,100));
                    aInfo.setPointsize(12);
                    //解决中文乱码问题,自己可以去随意定义个自己喜欢字体,我在这用的微软雅黑
                    String fontPath = "C:/WINDOWS/Fonts/MSYH.TTF";
    //              String fontPath = "/usr/maindata/MSYH.TTF";
                    aInfo.setFont(fontPath);
                    aInfo.setTextAntialias(true);
                    aInfo.setOpacity(0);
                    aInfo.setText(" " + text + "于 " + new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + " 上传于XXXX网,版权归作者所有!");
                    aInfo.setGeometry("+" + (wideth-tl) + "+" + (height-5));
                    scaled.annotateImage(aInfo);
                }
                scaled.setFileName(toImg);
                scaled.writeImage(info);
                scaled.destroyImages();
        }   
     
        /**
         * 切图
         * @param imgPath 源图路径
         * @param toPath  修改图路径
         * @param w
         * @param h
         * @param x
         * @param y
         * @throws MagickException
         */
        public static void cutImg(String imgPath, String toPath, int w, int h, int x, int y) throws MagickException {
            ImageInfo infoS = null;
            MagickImage image = null;
            MagickImage cropped = null;
            Rectangle rect = null;
            try {
                infoS = new ImageInfo(imgPath);
                image = new MagickImage(infoS);
                rect = new Rectangle(x, y, w, h);
                cropped = image.cropImage(rect);
                cropped.setFileName(toPath);
                cropped.writeImage(infoS);   
     
            } finally {
                if (cropped != null) {
                    cropped.destroyImages();
                }
            }
        }
    }
      

  3.   

    至于ImageMagick  把图片指定压缩大小。不是指120* 120这种,是500K 改成指定的20K之类的。正在求解!!
    不知道是不是没有这个属性!