⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imagemerger.java

📁 esri的ArcGIS Server超级学习模板程序(for java)
💻 JAVA
📖 第 1 页 / 共 2 页
字号:

    /**
    * convert an image to a (TIFF,PNG8,PNG,JPEG)
    */
    public void convertImage(
        byte[] inputFile,
        String outputFile,
        String type
    ) throws java.io.IOException, java.io.FileNotFoundException, Exception {
        javax.media.jai.PlanarImage src = readSourceImage(inputFile);
        src = checkImageBands(src);
        saveImage(src,outputFile,type, true);
    }

    /*****************************************************************************************************
    ******************************** private methods *****************************************************
    *****************************************************************************************************/

    /**
    * read the images from file system or URL
    */
    private javax.media.jai.PlanarImage readSourceImage(
       byte[] imageData
    ) throws java.net.MalformedURLException, java.io.IOException {
        javax.media.jai.PlanarImage src = null;
		com.sun.media.jai.codec.ByteArraySeekableStream byteStream = new 
			com.sun.media.jai.codec.ByteArraySeekableStream(imageData);
		src = javax.media.jai.JAI.create("stream", byteStream);
        return src;
    }

    /**
    * get an image with only the alpha values
    */
    private javax.media.jai.PlanarImage calculateAlphaImage(
        javax.media.jai.PlanarImage src,
        double transparency,
        String imageExtension,
        boolean bottom
    ) throws Exception {

        javax.media.jai.PlanarImage afa = null;
        if (src.getNumBands() == 4) {
            // get the existing alpha band only
            double[][] alphaMatrix = {{ .000D, .000D, .000D, 1.0D, 0.0D }};
            if (bottom)
            {
              alphaMatrix[0][0] = 255.0D;
              alphaMatrix[0][1] = 255.0D;
              alphaMatrix[0][2] = 255.0D;
              alphaMatrix[0][3] = 1.0D;
              alphaMatrix[0][4] = 255.0D;
            }
            java.awt.image.renderable.ParameterBlock pb = new java.awt.image.renderable.ParameterBlock();
            pb.addSource(src);
            pb.add(alphaMatrix);
            javax.media.jai.PlanarImage afaSrc = javax.media.jai.JAI.create("bandcombine", pb, null);
            // now add the transparency
            double[] constants = new double[1];
            constants[0] = transparency; // this image has only one band
            pb = new java.awt.image.renderable.ParameterBlock();
            pb.addSource(afaSrc);
            pb.add(constants);
            afa = javax.media.jai.JAI.create("multiplyconst", pb, null);

        } else if (src.getNumBands() <= 3) {
            // define alpha value for image on top
            int alpha = (int)(transparency*255);
            Byte [] bandValues = new Byte[3];
            bandValues[0] = new Byte((byte)alpha);
            bandValues[1] = new Byte((byte)alpha);
            bandValues[2] = new Byte((byte)alpha);
            java.awt.image.renderable.ParameterBlock pb = new java.awt.image.renderable.ParameterBlock();
            pb.add((float)src.getWidth()); // needs a graphic display
            pb.add((float)src.getHeight());
            pb.add(bandValues);
            afa = javax.media.jai.JAI.create("constant", pb, null);

//        } else {
//            throw new Exception("only images with 3 or 4 bands are supported");
        }

        return afa;
    }

    /**
    * get an image with only the 3 color bands
    */
    private javax.media.jai.PlanarImage checkImageBands(
        javax.media.jai.PlanarImage src
    ) {

        javax.media.jai.PlanarImage src3Bands = src;
        if (src.getNumBands() > 3) {

            // source image with only 3 bands
            double[][] matrix = {{ 1.0D, 0.0D, 0.0D, 0.0D, 0.0D },
                                 { 0.0D, 1.0D, 0.0D, 0.0D, 0.0D },
                                 { 0.0D, 0.0D, 1.0D, 0.0D, 0.0D }};
            java.awt.image.renderable.ParameterBlock pb = new java.awt.image.renderable.ParameterBlock();
            pb.addSource(src);
            pb.add(matrix);
            src3Bands = javax.media.jai.JAI.create("bandcombine", pb, null);
        }

        return src3Bands;
    }

    /**
    * if user didn't supply transparency factors, then set default values
    */
    private double[] checkTransparencyFactors(
        double[] transparencyFactors,
        int length
    ) {
        if (transparencyFactors == null) {
            transparencyFactors = new double[length];
            transparencyFactors[0] = 1.0;
            for (int i = 1; i < length; i++)
                transparencyFactors[i] = 0.5;
        }
        return transparencyFactors;
    }

    static int[][] getPixels(java.awt.Image image) throws java.io.IOException {
        int w = image.getWidth(null);
        int h = image.getHeight(null);
        int pix[] = new int[w * h];
        java.awt.image.PixelGrabber grabber = new java.awt.image.PixelGrabber(image, 0, 0, w, h, pix, 0, w);

        try {
            if (grabber.grabPixels() != true) {
                throw new java.io.IOException("Grabber returned false: " +
                                      grabber.status());
            }
        } catch (java.lang.InterruptedException e) {
			logger.warn("Unable to get pixels", e);
		}

        int pixels[][] = new int[w][h];
        for (int x = w; x-- > 0; ) {
            for (int y = h; y-- > 0; ) {
                pixels[x][y] = pix[y * w + x];
            }
        }

        return pixels;
    }

    /**
    * save image to file
    */
    private void saveImage(
        javax.media.jai.PlanarImage src,
        String fileName,
        String type,
        boolean reduceBand
    ) throws java.io.FileNotFoundException, java.io.IOException {

        if (type.equalsIgnoreCase("PNG8")) {
            type = "PNG";
            // convert 24 bit to 8 bit (3 band to 1 band)
            java.awt.image.renderable.ParameterBlock pb = new java.awt.image.renderable.ParameterBlock();

            javax.media.jai.ColorCube colorMap = javax.media.jai.ColorCube.BYTE_496;
            javax.media.jai.KernelJAI[] ditherMask = javax.media.jai.KernelJAI.DITHER_MASK_443;
            pb.addSource(src).add(colorMap).add(ditherMask);
            src = javax.media.jai.JAI.create("ordereddither", pb);
/*
            pb.addSource(src);
            pb.add(javax.media.jai.ColorCube.BYTE_496);
            pb.add(kernel);
            src = (javax.media.jai.PlanarImage)javax.media.jai.JAI.create("errordiffusion", pb, null);
*/
        } else if (type.equalsIgnoreCase("PNG") && src.getNumBands() >= 3) {
            com.sun.media.jai.codec.PNGEncodeParam.RGB param = new com.sun.media.jai.codec.PNGEncodeParam.RGB();
            int[] rgb = new int[3];
            rgb[0] = rgb[1] = rgb[2] = 255;
            param.setTransparentRGB(rgb);
            javax.media.jai.JAI.create("filestore", src, fileName, type, param);
            return;
        } else if (type.equalsIgnoreCase("JPG")) {
            type = "JPEG";
        } else if (type.equalsIgnoreCase("TIF")) {
            type = "TIFF";
        } else if (type.equalsIgnoreCase("GIF")) {
			int pos = fileName.indexOf(".GIF");
			String pngfile = fileName.substring(0, pos);
			pngfile = pngfile + ".PNG";
			if (src.getNumBands() >= 3){
				if (src.getNumBands() == 3){
					java.awt.image.renderable.ParameterBlock pb = new java.awt.image.renderable.ParameterBlock();

					javax.media.jai.ColorCube colorMap = javax.media.jai.ColorCube.BYTE_496;
					javax.media.jai.KernelJAI[] ditherMask = javax.media.jai.KernelJAI.DITHER_MASK_443;
					pb.addSource(src).add(colorMap).add(ditherMask);
					src = javax.media.jai.JAI.create("ordereddither", pb);
					javax.media.jai.JAI.create("filestore", src, pngfile, "PNG", null);
				}
				else{
					src = checkImageBands(src);
					com.sun.media.jai.codec.PNGEncodeParam.RGB param = new com.sun.media.jai.codec.PNGEncodeParam.RGB();
					int[] rgb = new int[3];
					rgb[0] = rgb[1] = rgb[2] = 255;
					param.setTransparentRGB(rgb);
					javax.media.jai.JAI.create("filestore", src, pngfile, "PNG", param);
				}
			}else
				javax.media.jai.JAI.create("filestore", src, pngfile, "PNG", null);

			javax.media.jai.PlanarImage planar = javax.media.jai.JAI.create("FileLoad", pngfile);
			java.awt.image.BufferedImage bufImg = planar.getAsBufferedImage();
			try{
				GifEncoder encoder = new GifEncoder(bufImg);
				GifEncoder.writeFile(bufImg, new java.io.File(fileName));
				encoder = null;
			}catch(Exception e){
				logger.warn("Unable to encode gif", e);
			}
			return;
//            setImage(src.getAsBufferedImage(), fileName);
        } else if (type.equalsIgnoreCase("TIFF") || type.equalsIgnoreCase("BMP") ||
			type.equalsIgnoreCase("JPEG") || type.equalsIgnoreCase("PNG") || type.equalsIgnoreCase("PNM")) {
            // leave it
        } else  {
            type = "JPEG";
        }

        javax.media.jai.JAI.create("filestore", src, fileName, type, null);
    }

    /**
    * merge images using the composite operation
    */
    private javax.media.jai.PlanarImage mergeImages(
        javax.media.jai.PlanarImage srcTop,
        javax.media.jai.PlanarImage srcBottom,
        javax.media.jai.PlanarImage afaTop,
        javax.media.jai.PlanarImage afaBottom
    ) {
        // first image in parameterBlock needs to be the image on top
        java.awt.image.renderable.ParameterBlock pb = new java.awt.image.renderable.ParameterBlock();
        pb.addSource(srcTop);
        pb.addSource(srcBottom);
        pb.add(afaTop);
        pb.add(afaBottom);
        pb.add(new Boolean(false));
        pb.add(javax.media.jai.operator.CompositeDescriptor.NO_DESTINATION_ALPHA);
        return javax.media.jai.JAI.create("composite", pb, null);
    }

    private void checkImageList(String[] imageList, double[] transFactors)
    {
      int cnt=0;

      int[] idx;
      idx = new int[imageList.length];
      for (int i=0; i<imageList.length; i++)
      {
        long curtime = System.currentTimeMillis();
        while (!checkImage(imageList[i]) && (System.currentTimeMillis() - curtime) < 15000)
            while ((System.currentTimeMillis() - curtime) < 2000) {}
        if (!checkImage(imageList[i]))
        {
          idx[cnt] = i;
          cnt++;
        }
      }
      String[] newStrings = new String[imageList.length - cnt];
      double[] newFactors = new double[imageList.length - cnt];
      int ncnt=0;
      boolean fnd=false;
      for (int i=0; i<imageList.length; i++)
      {
        fnd=false;
        for (int j=0; j<cnt; j++)
        {
          if (i == idx[j])
          {
            fnd=true;
            break;
          }
        }
        if (!fnd)
        {
          newStrings[ncnt] = imageList[i];
          newFactors[ncnt] = transFactors[i];
          ncnt++;
        }
      }
      _imageList = newStrings;
      _transFactors = newFactors;

    }

    private boolean checkImage(String fileName){
      javax.media.jai.PlanarImage src = null;
      try{
          if (fileName.startsWith("http://") || fileName.startsWith("https://")){
            java.net.URL imageUrl = new java.net.URL(fileName);
            java.net.URLConnection con = imageUrl.openConnection();
            java.io.InputStream imageStream = com.sun.media.jai.codec.SeekableStream.wrapInputStream(con.getInputStream(),true);
            src = javax.media.jai.JAI.create("stream", imageStream);
          }
          else
            src = javax.media.jai.JAI.create("FileLoad", fileName);
          return true;
      }
      catch(java.net.MalformedURLException e){
		  logger.warn("Unable to check image:MalformedURLException", e);
	  }
      catch(java.io.IOException e){
		  logger.warn("Unable to check image:IOException", e);
      }      
      return false;
    }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -