@Override public void paint(Graphics g) { g2d = (Graphics2D) g; g2d.drawImage(bi, 0, 0, bi.getWidth(), bi.getHeight(), null); g2d.setColor(Color.WHITE); g2d.setColor(getAverageColor(bi)); g2d.fillRect(bi.getMinX(), bi.getMinY(), 60, 60); }
protected boolean drawImage(Image img, AffineTransform xform, Color bgcolor, ImageObserver obs) { boolean rv; if (comp == null || comp instanceof AlphaComposite) rv = super.drawImage(img, xform, bgcolor, obs); else { // Get buffered image of source if (!(img instanceof BufferedImage)) { ImageProducer source = img.getSource(); if (source == null) return false; img = Toolkit.getDefaultToolkit().createImage(source); } BufferedImage bImg = (BufferedImage) img; // Find translated bounds Point2D origin = new Point2D.Double(bImg.getMinX(), bImg.getMinY()); Point2D pt = new Point2D.Double(bImg.getWidth() + bImg.getMinX(), bImg.getHeight() + bImg.getMinY()); if (xform != null) { origin = xform.transform(origin, origin); pt = xform.transform(pt, pt); } // Create buffer and draw image createBuffer(); Graphics2D g2d = (Graphics2D) buffer.getGraphics(); g2d.setRenderingHints(this.getRenderingHints()); g2d.drawImage(img, xform, obs); // Perform compositing rv = drawComposite( new Rectangle2D.Double(origin.getX(), origin.getY(), pt.getX(), pt.getY()), obs); } return rv; }
// ¸ù¾ÝͼƬ·¾¶£¬¶ÁȡͼƬÐÅÏ¢£¬´æ´¢µ½mapÖв¢·µ»Ø public static Map<String, Object> readImg(String path) { Map<String, Object> map = new HashMap<String, Object>(); File file = new File(path); if (!file.exists()) { System.out.println("Ä¿±êͼƬ²»´æÔÚ"); return null; } String fileName = file.getName(); map.put("fileName", fileName); String formatType = fileName.substring(fileName.lastIndexOf(".") + 1); map.put("formatType", formatType); BufferedImage image = null; try { image = ImageIO.read(file); } catch (IOException e) { e.printStackTrace(); } if (image == null) { System.out.println("ͼƬ¶Áȡʧ°Ü£¬Çë¼ì²éͼƬ"); return null; } int imageType = image.getType(); map.put("imageType", imageType); int width = image.getWidth(); int height = image.getHeight(); map.put("width", width); map.put("height", height); int minx = image.getMinX(); int miny = image.getMinY(); map.put("minx", minx); map.put("miny", miny); int offset = 0; int scansize = width; int[] pixelArray = new int[offset + (height - miny) * scansize]; image.getRGB(minx, miny, width, height, pixelArray, offset, scansize); map.put("pixelArray", pixelArray); return map; }
/** * Returns average color of picture * * @return */ public static Color getAverageColor(BufferedImage bi) { int index = 0; long redSum = 0; long greenSum = 0; long blueSum = 0; for (int x = bi.getMinX(); x < bi.getWidth(); x += 4) { for (int y = bi.getMinY(); y < bi.getHeight(); y += 4) { int rgb = bi.getRGB(x, y); Color c = new Color(rgb); int red = c.getRed(); redSum += red; int green = c.getGreen(); greenSum += green; int blue = c.getBlue(); blueSum += blue; c = new Color(red, green, blue); bi.setRGB(x, y, c.getRGB()); index++; } } return new Color( new Integer((int) (redSum / index)), (int) greenSum / index, (int) blueSum / index); }
// <editor-fold defaultstate="collapsed" desc="Visualization"> @Override protected void paintComponent(Graphics g) { final Graphics2D G2 = (Graphics2D) g.create(); G2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); G2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); G2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE); G2.setRenderingHint( RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); G2.translate(getInnerBounds().x, getInnerBounds().y); if (lcdBackgroundVisible) { G2.drawImage(lcdImage, 0, 0, null); } // Draw lcd text if (lcdColor == LcdColor.CUSTOM) { G2.setColor(customLcdForeground); } else { G2.setColor(lcdColor.TEXT_COLOR); } G2.setFont(lcdUnitFont); final double UNIT_STRING_WIDTH; if (lcdUnitStringVisible && !lcdUnitString.isEmpty()) { unitLayout = new TextLayout(lcdUnitString, G2.getFont(), RENDER_CONTEXT); UNIT_BOUNDARY.setFrame(unitLayout.getBounds()); if (lcdTextVisible) { G2.drawString( lcdUnitString, (float) ((lcdImage.getWidth() - UNIT_BOUNDARY.getWidth()) - lcdImage.getHeight() * 0.15f), (lcdImage.getHeight() * 0.6f)); } UNIT_STRING_WIDTH = UNIT_BOUNDARY.getWidth(); } else { UNIT_STRING_WIDTH = 0; } // Draw value and oldValue switch (numberSystem) { case DEC: default: G2.setFont(lcdValueFont); valueLayout = new TextLayout(formatLcdValue(lcdValue), G2.getFont(), RENDER_CONTEXT); VALUE_BOUNDARY.setFrame(valueLayout.getBounds()); if (lcdTextVisible) { G2.drawString( formatLcdValue(lcdValue), (float) ((lcdImage.getMinX() + (lcdImage.getWidth() - UNIT_STRING_WIDTH - VALUE_BOUNDARY.getWidth()) - lcdImage.getHeight() * 0.3)), (lcdImage.getHeight() * 0.6f)); } G2.setFont(lcdFormerValueFont); oldValueLayout = new TextLayout(formatLcdValue(oldValue), G2.getFont(), RENDER_CONTEXT); OLD_VALUE_BOUNDARY.setFrame(oldValueLayout.getBounds()); if (lcdTextVisible) { G2.drawString( formatLcdValue(oldValue), (float) ((lcdImage.getWidth() - OLD_VALUE_BOUNDARY.getWidth()) / 2f), (lcdImage.getHeight() * 0.9f)); } break; case HEX: G2.setFont(lcdValueFont); valueLayout = new TextLayout( Integer.toHexString((int) lcdValue).toUpperCase(), G2.getFont(), RENDER_CONTEXT); VALUE_BOUNDARY.setFrame(valueLayout.getBounds()); if (lcdTextVisible) { G2.drawString( Integer.toHexString((int) lcdValue).toUpperCase(), (float) ((lcdImage.getMinX() + (lcdImage.getWidth() - UNIT_STRING_WIDTH - VALUE_BOUNDARY.getWidth()) - lcdImage.getHeight() * 0.3)), (lcdImage.getHeight() * 0.6f)); } G2.setFont(lcdFormerValueFont); oldValueLayout = new TextLayout( Integer.toHexString((int) oldValue).toUpperCase(), G2.getFont(), RENDER_CONTEXT); OLD_VALUE_BOUNDARY.setFrame(oldValueLayout.getBounds()); if (lcdTextVisible) { G2.drawString( Integer.toHexString((int) oldValue).toUpperCase(), (float) ((lcdImage.getWidth() - OLD_VALUE_BOUNDARY.getWidth()) / 2f), (lcdImage.getHeight() * 0.9f)); } break; case OCT: G2.setFont(lcdValueFont); valueLayout = new TextLayout(Integer.toOctalString((int) lcdValue), G2.getFont(), RENDER_CONTEXT); VALUE_BOUNDARY.setFrame(valueLayout.getBounds()); if (lcdTextVisible) { G2.drawString( Integer.toOctalString((int) lcdValue), (float) ((lcdImage.getMinX() + (lcdImage.getWidth() - UNIT_STRING_WIDTH - VALUE_BOUNDARY.getWidth()) - lcdImage.getHeight() * 0.3)), (lcdImage.getHeight() * 0.6f)); } G2.setFont(lcdFormerValueFont); oldValueLayout = new TextLayout(Integer.toOctalString((int) oldValue), G2.getFont(), RENDER_CONTEXT); OLD_VALUE_BOUNDARY.setFrame(oldValueLayout.getBounds()); if (lcdTextVisible) { G2.drawString( Integer.toOctalString((int) oldValue), (float) ((lcdImage.getWidth() - OLD_VALUE_BOUNDARY.getWidth()) / 2f), (lcdImage.getHeight() * 0.9f)); } break; } // Draw lcd info string if (!lcdInfoString.isEmpty()) { G2.setFont(lcdInfoFont); infoLayout = new TextLayout(lcdInfoString, G2.getFont(), RENDER_CONTEXT); INFO_BOUNDARY.setFrame(infoLayout.getBounds()); G2.drawString(lcdInfoString, 5f, (float) INFO_BOUNDARY.getHeight() + 5f); } // Draw lcd threshold indicator if (numberSystem == NumberSystem.DEC && lcdThresholdVisible && lcdValue >= lcdThreshold) { if (!lcdThresholdBehaviourInverted) { if (lcdValue >= lcdThreshold) { G2.drawImage(lcdThresholdImage, 5, getHeight() - lcdThresholdImage.getHeight() - 5, null); } } else { if (lcdValue <= lcdThreshold) { G2.drawImage(lcdThresholdImage, 5, getHeight() - lcdThresholdImage.getHeight() - 5, null); } } } if (glowVisible && glowing) { G2.drawImage(glowImageOn, 0, 0, null); } if (!isEnabled()) { G2.setColor(DISABLED_COLOR); G2.fill(disabledShape); } G2.translate(-getInnerBounds().x, -getInnerBounds().y); G2.dispose(); }
private boolean drawComposite(Rectangle2D bounds, ImageObserver observer) { // Clip source to visible areas that need updating Rectangle2D clip = this.getClipBounds(); Rectangle2D.intersect(bounds, clip, bounds); clip = new Rectangle( buffer.getMinX(), buffer.getMinY(), buffer.getWidth(), buffer.getHeight()); Rectangle2D.intersect(bounds, clip, bounds); BufferedImage buffer2 = buffer; if (!bounds.equals(buffer2.getRaster().getBounds())) buffer2 = buffer2.getSubimage( (int) bounds.getX(), (int) bounds.getY(), (int) bounds.getWidth(), (int) bounds.getHeight()); // Get destination clip to bounds double[] points = new double[] { bounds.getX(), bounds.getY(), bounds.getMaxX(), bounds.getMaxY() }; transform.transform(points, 0, points, 0, 2); Rectangle2D deviceBounds = new Rectangle2D.Double(points[0], points[1], points[2] - points[0], points[3] - points[1]); Rectangle2D.intersect(deviceBounds, this.getClipInDevSpace(), deviceBounds); // Get current image on the component GtkImage img = grab(component); Graphics gr = componentBuffer.createGraphics(); gr.drawImage(img, 0, 0, null); gr.dispose(); BufferedImage cBuffer = componentBuffer; if (!deviceBounds.equals(cBuffer.getRaster().getBounds())) cBuffer = cBuffer.getSubimage( (int) deviceBounds.getX(), (int) deviceBounds.getY(), (int) deviceBounds.getWidth(), (int) deviceBounds.getHeight()); // Perform actual composite operation compCtx.compose(buffer2.getRaster(), cBuffer.getRaster(), cBuffer.getRaster()); // This MUST call directly into the "action" method in CairoGraphics2D, // not one of the wrappers, to ensure that the composite isn't processed // more than once! boolean rv = super.drawImage( cBuffer, AffineTransform.getTranslateInstance(bounds.getX(), bounds.getY()), null, null); return rv; }
@Override public Rectangle2D getBounds2D() { return new Rectangle2D.Double( bImage.getMinX(), bImage.getMinY(), bImage.getWidth(), bImage.getHeight()); }