public static boolean compressPic(String srcFilePath, String descFilePath) { File file = null; BufferedImage src = null; FileOutputStream out = null; ImageWriter imgWrier; ImageWriteParam imgWriteParams; // 指定写图片的方式为 jpg imgWrier = ImageIO.getImageWritersByFormatName("jpg").next(); imgWriteParams = new javax.imageio.plugins.jpeg.JPEGImageWriteParam(null); // 要使用压缩,必须指定压缩方式为MODE_EXPLICIT imgWriteParams.setCompressionMode(imgWriteParams.MODE_EXPLICIT); // 这里指定压缩的程度,参数qality是取值0~1范围内, imgWriteParams.setCompressionQuality((float) 0.1); imgWriteParams.setProgressiveMode(imgWriteParams.MODE_DISABLED); ColorModel colorModel = ColorModel.getRGBdefault(); // 指定压缩时使用的色彩模式 imgWriteParams.setDestinationType( new javax.imageio.ImageTypeSpecifier( colorModel, colorModel.createCompatibleSampleModel(16, 16))); try { if (StringUtils.isBlank(srcFilePath)) { return false; } else { file = new File(srcFilePath); src = ImageIO.read(file); out = new FileOutputStream(descFilePath); imgWrier.reset(); // 必须先指定 out值,才能调用write方法, ImageOutputStream可以通过任何 OutputStream构造 imgWrier.setOutput(ImageIO.createImageOutputStream(out)); // 调用write方法,就可以向输入流写图片 imgWrier.write(null, new IIOImage(src, null, null), imgWriteParams); out.flush(); out.close(); } } catch (Exception e) { e.printStackTrace(); return false; } return true; }
// This method returns true if the specified image has transparent pixels // Source: http://www.exampledepot.com/egs/java.awt.image/HasAlpha.html public static boolean hasAlpha(Image image) { // If buffered image, the color model is readily available if (image instanceof BufferedImage) { BufferedImage bimage = (BufferedImage) image; return bimage.getColorModel().hasAlpha(); } // Use a pixel grabber to retrieve the image's color model; // grabbing a single pixel is usually sufficient PixelGrabber pg = new PixelGrabber(image, 0, 0, 1, 1, false); try { pg.grabPixels(); } catch (InterruptedException e) { } // Get the image's color model ColorModel cm = pg.getColorModel(); return cm.hasAlpha(); }
/** * PS see http://astronomy.swin.edu.au/~pbourke/geomformats/postscript/ Java * http://show.docjava.com:8086/book/cgij/doc/ip/graphics/SimpleImageFrame.java.html */ public boolean drawImage( Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer) { try { // get data from image int[] pixels = new int[width * height]; PixelGrabber grabber = new PixelGrabber(img, 0, 0, width, height, pixels, 0, width); grabber.grabPixels(); ColorModel model = ColorModel.getRGBdefault(); // print data to ps m_printstream.println("gsave"); m_printstream.println( xTransform(xScale(x)) + " " + (yTransform(yScale(y)) - yScale(height)) + " translate"); m_printstream.println(xScale(width) + " " + yScale(height) + " scale"); m_printstream.println( width + " " + height + " " + "8" + " [" + width + " 0 0 " + (-height) + " 0 " + height + "]"); m_printstream.println("{<"); int index; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { index = i * width + j; m_printstream.print(toHex(model.getRed(pixels[index]))); m_printstream.print(toHex(model.getGreen(pixels[index]))); m_printstream.print(toHex(model.getBlue(pixels[index]))); } m_printstream.println(); } m_printstream.println(">}"); m_printstream.println("false 3 colorimage"); m_printstream.println("grestore"); return true; } catch (Exception e) { e.printStackTrace(); return false; } }
private void readHeader() throws IOException { if (gotHeader) { iis.seek(128); return; } metadata = new PCXMetadata(); manufacturer = iis.readByte(); // manufacturer if (manufacturer != MANUFACTURER) throw new IllegalStateException("image is not a PCX file"); metadata.version = iis.readByte(); // version encoding = iis.readByte(); // encoding if (encoding != ENCODING) throw new IllegalStateException("image is not a PCX file, invalid encoding " + encoding); metadata.bitsPerPixel = iis.readByte(); metadata.xmin = iis.readShort(); metadata.ymin = iis.readShort(); xmax = iis.readShort(); ymax = iis.readShort(); metadata.hdpi = iis.readShort(); metadata.vdpi = iis.readShort(); iis.readFully(smallPalette); iis.readByte(); // reserved colorPlanes = iis.readByte(); bytesPerLine = iis.readShort(); paletteType = iis.readShort(); metadata.hsize = iis.readShort(); metadata.vsize = iis.readShort(); iis.skipBytes(54); // skip filler width = xmax - metadata.xmin + 1; height = ymax - metadata.ymin + 1; if (colorPlanes == 1) { if (paletteType == PALETTE_GRAYSCALE) { ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY); int[] nBits = {8}; colorModel = new ComponentColorModel( cs, nBits, false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE); sampleModel = new ComponentSampleModel(DataBuffer.TYPE_BYTE, width, height, 1, width, new int[] {0}); } else { if (metadata.bitsPerPixel == 8) { // read palette from end of file, then reset back to image data iis.mark(); if (iis.length() == -1) { // read until eof, and work backwards while (iis.read() != -1) ; iis.seek(iis.getStreamPosition() - 256 * 3 - 1); } else { iis.seek(iis.length() - 256 * 3 - 1); } int palletteMagic = iis.read(); if (palletteMagic != 12) processWarningOccurred( "Expected palette magic number 12; instead read " + palletteMagic + " from this image."); iis.readFully(largePalette); iis.reset(); colorModel = new IndexColorModel(metadata.bitsPerPixel, 256, largePalette, 0, false); sampleModel = colorModel.createCompatibleSampleModel(width, height); } else { int msize = metadata.bitsPerPixel == 1 ? 2 : 16; colorModel = new IndexColorModel(metadata.bitsPerPixel, msize, smallPalette, 0, false); sampleModel = colorModel.createCompatibleSampleModel(width, height); } } } else { ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB); int[] nBits = {8, 8, 8}; colorModel = new ComponentColorModel( cs, nBits, false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE); sampleModel = new ComponentSampleModel( DataBuffer.TYPE_BYTE, width, height, 1, width * colorPlanes, new int[] {0, width, width * 2}); } originalSampleModel = sampleModel; originalColorModel = colorModel; gotHeader = true; }
public void write(BufferedImage image, AVList params) throws IOException { if (image == null) { String msg = Logging.getMessage("nullValue.ImageSource"); Logging.logger().severe(msg); throw new IllegalArgumentException(msg); } if (0 == image.getWidth() || 0 == image.getHeight()) { String msg = Logging.getMessage("generic.InvalidImageSize", image.getWidth(), image.getHeight()); Logging.logger().severe(msg); throw new IllegalArgumentException(msg); } if (null == params || 0 == params.getValues().size()) { String reason = Logging.getMessage("nullValue.AVListIsNull"); Logging.logger().finest(Logging.getMessage("GeotiffWriter.GeoKeysMissing", reason)); params = new AVListImpl(); } else { this.validateParameters(params, image.getWidth(), image.getHeight()); } // how we proceed in part depends upon the image type... int type = image.getType(); // handle CUSTOM type which comes from our GeoTiffreader (for now) if (BufferedImage.TYPE_CUSTOM == type) { int numColorComponents = 0, numComponents = 0, pixelSize = 0, dataType = 0, csType = 0; boolean hasAlpha = false; if (null != image.getColorModel()) { ColorModel cm = image.getColorModel(); numColorComponents = cm.getNumColorComponents(); numComponents = cm.getNumComponents(); pixelSize = cm.getPixelSize(); hasAlpha = cm.hasAlpha(); ColorSpace cs = cm.getColorSpace(); if (null != cs) csType = cs.getType(); } if (null != image.getSampleModel()) { SampleModel sm = image.getSampleModel(); dataType = sm.getDataType(); } if (dataType == DataBuffer.TYPE_FLOAT && pixelSize == Float.SIZE && numComponents == 1) { type = BufferedImage_TYPE_ELEVATION_FLOAT32; } else if (dataType == DataBuffer.TYPE_SHORT && pixelSize == Short.SIZE && numComponents == 1) { type = BufferedImage_TYPE_ELEVATION_SHORT16; } else if (ColorSpace.CS_GRAY == csType && pixelSize == Byte.SIZE) { type = BufferedImage.TYPE_BYTE_GRAY; } else if (dataType == DataBuffer.TYPE_USHORT && ColorSpace.CS_GRAY == csType && pixelSize == Short.SIZE) { type = BufferedImage.TYPE_USHORT_GRAY; } else if (ColorSpace.TYPE_RGB == csType && pixelSize == 3 * Byte.SIZE && numColorComponents == 3) { type = BufferedImage.TYPE_3BYTE_BGR; } else if (ColorSpace.TYPE_RGB == csType && hasAlpha && pixelSize == 4 * Byte.SIZE && numComponents == 4) { type = BufferedImage.TYPE_4BYTE_ABGR; } } switch (type) { case BufferedImage.TYPE_3BYTE_BGR: case BufferedImage.TYPE_4BYTE_ABGR: case BufferedImage.TYPE_4BYTE_ABGR_PRE: case BufferedImage.TYPE_INT_RGB: case BufferedImage.TYPE_INT_BGR: case BufferedImage.TYPE_INT_ARGB: case BufferedImage.TYPE_INT_ARGB_PRE: { this.writeColorImage(image, params); } break; case BufferedImage.TYPE_USHORT_GRAY: case BufferedImage.TYPE_BYTE_GRAY: { this.writeGrayscaleImage(image, params); } break; case BufferedImage_TYPE_ELEVATION_SHORT16: case BufferedImage_TYPE_ELEVATION_FLOAT32: { String msg = Logging.getMessage("GeotiffWriter.FeatureNotImplementedd", type); Logging.logger().severe(msg); throw new IllegalArgumentException(msg); } // break; case BufferedImage.TYPE_CUSTOM: default: { ColorModel cm = image.getColorModel(); SampleModel sm = image.getSampleModel(); StringBuffer sb = new StringBuffer(Logging.getMessage("GeotiffWriter.UnsupportedType", type)); sb.append("\n"); sb.append("NumBands=").append(sm.getNumBands()).append("\n"); sb.append("NumDataElements=").append(sm.getNumDataElements()).append("\n"); sb.append("NumColorComponents=").append(cm.getNumColorComponents()).append("\n"); sb.append("NumComponents=").append(cm.getNumComponents()).append("\n"); sb.append("PixelSize=").append(cm.getPixelSize()).append("\n"); sb.append("hasAlpha=").append(cm.hasAlpha()); String msg = sb.toString(); Logging.logger().severe(msg); throw new IllegalArgumentException(msg); } } }
public void actionPerformed(ActionEvent evt) { Graphics g = getGraphics(); if (evt.getSource() == openItem) { JFileChooser chooser = new JFileChooser(); common.chooseFile(chooser, "./images", 0); // 设置默认目录,过滤文件 int r = chooser.showOpenDialog(null); if (r == JFileChooser.APPROVE_OPTION) { String name = chooser.getSelectedFile().getAbsolutePath(); // 装载图像 iImage = common.openImage(name, new MediaTracker(this)); // 取载入图像的宽和高 iw = iImage.getWidth(null); ih = iImage.getHeight(null); bImage = new BufferedImage(iw, ih, BufferedImage.TYPE_INT_RGB); Graphics2D g2 = bImage.createGraphics(); g2.drawImage(iImage, 0, 0, null); loadflag = true; repaint(); } } else if (evt.getSource() == rotateItem) // 内置旋转 { setTitle("第4章 图像几何变换 内置旋转 作者 孙燮华"); common.draw(g, iImage, bImage, common.getParam("旋转角(度):", "30"), 0, 0); } else if (evt.getSource() == scaleItem) // 内置缩放 { setTitle("第4章 图像几何变换 内置缩放 作者 孙燮华"); // 参数选择面板 Parameters pp = new Parameters("参数", "x方向:", "y方向:", "1.5", "1.5"); setPanel(pp, "内置缩放"); float x = pp.getPadx(); float y = pp.getPady(); common.draw(g, iImage, bImage, x, y, 1); } else if (evt.getSource() == shearItem) // 内置错切 { setTitle("第4章 图像几何变换 内置错切 作者 孙燮华"); Parameters pp = new Parameters("参数", "x方向:", "y方向:", "0.5", "0.5"); setPanel(pp, "内置错切"); float x = pp.getPadx(); float y = pp.getPady(); common.draw(g, iImage, bImage, x, y, 2); } else if (evt.getSource() == transItem) // 内置平移 { setTitle("第4章 图像几何变换 内置平移 作者 孙燮华"); Parameters pp = new Parameters("参数", "x方向:", "y方向:", "100", "50"); setPanel(pp, "内置平移"); float x = pp.getPadx(); float y = pp.getPady(); common.draw(g, iImage, bImage, x, y, 3); } else if (evt.getSource() == rotItem) // 旋转算法 { setTitle("第4章 图像几何变换 旋转算法 作者 孙燮华"); pix = common.grabber(iImage, iw, ih); // 旋转,输出图像宽高 int owh = (int) (Math.sqrt(iw * iw + ih * ih + 0.5)); opix = geom.imRotate(pix, common.getParam("旋转角(度):", "30"), iw, ih, owh); // 将数组中的象素产生一个图像 MemoryImageSource memoryImage = new MemoryImageSource(owh, owh, ColorModel.getRGBdefault(), opix, 0, owh); oImage = createImage(memoryImage); common.draw(g, iImage, oImage, iw, ih, owh, 4); } else if (evt.getSource() == mirItem) // 镜象算法(type:5) { setTitle("第4章 图像几何变换 镜象算法 作者 孙燮华"); Parameters pp = new Parameters("选择镜象类型", "水平", "垂直"); setPanel(pp, "镜象算法"); pix = common.grabber(iImage, iw, ih); opix = geom.imMirror(pix, iw, ih, pp.getRadioState()); ImageProducer ip = new MemoryImageSource(iw, ih, opix, 0, iw); oImage = createImage(ip); common.draw(g, iImage, oImage, iw, ih, 0, 5); } else if (evt.getSource() == shrItem) // 错切算法(type:6) { setTitle("第4章 图像几何变换 错切算法 作者 孙燮华"); Parameters pp = new Parameters("参数", "x方向:", "y方向:", "0.5", "0.5"); setPanel(pp, "错切算法"); pix = common.grabber(iImage, iw, ih); float shx = pp.getPadx(); float shy = pp.getPady(); // 计算包围盒的宽和高 int ow = (int) (iw + (ih - 1) * shx); int oh = (int) ((iw - 1) * shy + ih); if (shx > 0 && shy > 0) { opix = geom.imShear(pix, shx, shy, iw, ih, ow, oh); ImageProducer ip = new MemoryImageSource(ow, oh, opix, 0, ow); oImage = createImage(ip); common.draw(g, iImage, oImage, iw, ih, 0, 6); } else JOptionPane.showMessageDialog(null, "参数必须为正数!"); } else if (evt.getSource() == trnItem) { setTitle("第4章 图像几何变换 平移算法 作者 孙燮华"); Parameters pp = new Parameters("参数", "x方向:", "y方向:", "100", "50"); setPanel(pp, "平移算法"); pix = common.grabber(iImage, iw, ih); int tx = (int) pp.getPadx(); int ty = (int) pp.getPady(); if (tx > 0 && ty > 0) { int ow = iw + tx; int oh = ih + ty; opix = geom.imTrans(pix, tx, ty, iw, ih, ow, oh); ImageProducer ip = new MemoryImageSource(ow, oh, opix, 0, ow); oImage = createImage(ip); common.draw(g, iImage, oImage, iw, ih, 0, 7); } else JOptionPane.showMessageDialog(null, "参数必须为正数!"); } else if (evt.getSource() == nearItem) { setTitle("第4章 图像几何变换 最邻近插值算法 作者 孙燮华"); pix = common.grabber(iImage, iw, ih); float p = (Float.valueOf(JOptionPane.showInputDialog(null, "输入缩放参数(0.1-3.0)", "1.50"))) .floatValue(); int ow = (int) (p * iw); // 计算目标图宽高 int oh = (int) (p * ih); opix = geom.nearNeighbor(pix, iw, ih, ow, oh, p); ImageProducer ip = new MemoryImageSource(ow, oh, opix, 0, ow); oImage = createImage(ip); common.draw(g, oImage, "最邻近插值", p); } else if (evt.getSource() == linrItem) { setTitle("第4章 图像几何变换 双线性插值算法 作者 孙燮华"); pix = common.grabber(iImage, iw, ih); float p = (Float.valueOf(JOptionPane.showInputDialog(null, "输入缩放参数(0.1-3.0)", "1.50"))) .floatValue(); int ow = (int) (p * iw); // 计算目标图宽高 int oh = (int) (p * ih); opix = geom.bilinear(pix, iw, ih, ow, oh, p); ImageProducer ip = new MemoryImageSource(ow, oh, opix, 0, ow); oImage = createImage(ip); common.draw(g, oImage, "双线性插值", p); } else if (evt.getSource() == cubicItem) { setTitle("第4章 图像几何变换 三次卷积插值算法 作者 孙燮华"); pix = common.grabber(iImage, iw, ih); float p = (Float.valueOf(JOptionPane.showInputDialog(null, "输入缩放参数(1.1-3.0)", "1.50"))) .floatValue(); if (p < 1) { JOptionPane.showMessageDialog(null, "参数p必须大于1!"); return; } int ow = (int) (p * iw); // 计算目标图宽高 int oh = (int) (p * ih); opix = geom.scale(pix, iw, ih, ow, oh, p, p); ImageProducer ip = new MemoryImageSource(ow, oh, opix, 0, ow); oImage = createImage(ip); common.draw(g, oImage, "三次卷积插值", p); } else if (evt.getSource() == okButton) dialog.dispose(); else if (evt.getSource() == exitItem) System.exit(0); }