图片设置3D效果

   /**
     * 图片绘制3d效果
     * @param srcImage
     * @param radius
     * @param border
     * @param padding
     * @return
     * @throws IOException
     */
    public static BufferedImage draw3D(BufferedImage srcImage, int radius, int border, int padding, Color bgColor) throws IOException{
        int width = srcImage.getWidth();
        int height = srcImage.getHeight();
        int size = (width + height ) / 2;
        Shape shape = new RoundRectangle2D.Float(0, 0, width, height, radius, radius);

        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d = image.createGraphics();

        //绘制渐变背景
        if(bgColor == null){
            bgColor = Color.LIGHT_GRAY;
        }
        GradientPaint paint = new GradientPaint(0, 0, bgColor.darker(), 0, height,  bgColor.brighter().brighter());
        g2d.setPaint(paint);
        g2d.setComposite(AlphaComposite.DstIn);
        g2d.fillRect(0, 0, width, height); 

        //绘图
        g2d.setComposite(AlphaComposite.Src);
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.fill(shape);
        g2d.setComposite(AlphaComposite.SrcAtop);
        g2d.drawImage(setClip(srcImage, radius), 0, 0, null);

        //设置高亮效果
        g2d.setColor(new Color(255, 255, 255, 150));
        Shape highlightArea = createHighlightShape(0, 0, size, shape);
        g2d.fill(highlightArea);

        //绘制边框
        if(border !=0){
            g2d.setColor(Color.LIGHT_GRAY);
            g2d.setStroke(new BasicStroke(border));
            g2d.drawRoundRect(border / 2, border/2, width- border, height- border, radius, radius);
        }
        g2d.dispose();

        //加旁白
        if(padding > 0){
            int canvasWidth = width + padding * 2;
            int canvasHeight = height + padding * 2;
            BufferedImage newImage = new BufferedImage(canvasWidth, canvasHeight, BufferedImage.TYPE_INT_ARGB);
            Graphics2D gd = newImage.createGraphics();
            float[] fractions = {0.0f, 0.6f};
            Color[] colors = {Color.LIGHT_GRAY, Color.WHITE};
            Point2D center = new Point2D.Float(canvasWidth / 2, canvasHeight /2);
            RadialGradientPaint paint2 = new RadialGradientPaint(center, size, fractions, colors);
            gd.setPaint(paint2);
            gd.setComposite(AlphaComposite.Src);
            gd.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            gd.fill(new RoundRectangle2D.Float(0, 0, canvasWidth, canvasHeight, radius, radius));
            gd.setComposite(AlphaComposite.SrcAtop);
            gd.drawImage(image, padding, padding, null);
            return newImage;
        }
        return image;
    }

    /**
     * 图片设置圆角
     * @param srcImage
     * @return
     * @throws IOException
     */
    public static BufferedImage draw3D(BufferedImage srcImage) throws IOException{
        int radius = (srcImage.getWidth() + srcImage.getHeight()) / 6;
        return draw3D(srcImage, radius, 2, 5, null);
    }

    /**
     * 图片切圆角
     * @param srcImage
     * @param radius
     * @return
     */
    public static BufferedImage setClip(BufferedImage srcImage, int radius){
        int width = srcImage.getWidth();
        int height = srcImage.getHeight();
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d = image.createGraphics();

        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setClip(new RoundRectangle2D.Double(0, 0, width, height, radius, radius));
        g2d.drawImage(srcImage, 0, 0, null);
        g2d.dispose();
        return image;
    }

    /**
     * 描边
     */
    public static BufferedImage setBorder(BufferedImage srcImage){
        int width = srcImage.getWidth();
        int height = srcImage.getHeight();
        int border = 1;

        int nWidth = width + border * 2;
        int nHeight = height + border * 2;

        BufferedImage image = new BufferedImage(nWidth, nHeight, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d = image.createGraphics();
        int colorIncrement = 4;
        for(int i = border; i > 0; i--){
            int nw = width + 2 * i;
            int nh = height + 2 * i;
            BufferedImage tImage = new BufferedImage(nw, nh, BufferedImage.TYPE_INT_ARGB);
            Graphics2D tgs = tImage.createGraphics();
            tgs.drawImage(srcImage, 0, 0, nw, nh, null);

            int red = 255 - colorIncrement * (border - i);
            int green = 255 - colorIncrement * (border - i);
            int blue = 255 - colorIncrement * (border - i);
            int rgb =  new Color(red, green, blue).getRGB();
            System.out.println(rgb);
            for(int x = 0 ; x < nw; x++){
                for(int y = 0; y < nh; y++){
                    if(tImage.getRGB(x, y)!=0){
                        tImage.setRGB(x, y, rgb);
                    }
                }
            }

            tgs.dispose();
            g2d.drawImage(tImage, border - i, border -i, null);
        }
        g2d.drawImage(srcImage, border, border, null);
        g2d.dispose();
        return image;
    }

    /**
     * 高亮层
     * @param centerX
     * @param centerY
     * @param size
     * @param body
     * @return
     */
    private static Shape createHighlightShape(int centerX, int centerY, int size, Shape body) {
        double myRadius = size * 4;
        double x = centerX - size * 2.3;
        double y = centerY - size * 3.2;
        Ellipse2D.Double circle = new Ellipse2D.Double(x, y, myRadius, myRadius);
        Area area = new Area(circle);
        area.intersect(new Area(body));
        return area;
    }

时间: 2024-12-07 08:41:17

图片设置3D效果的相关文章

wpf 模拟3D效果(和手机浏览图片效果相似)(附源码)

原文 wpf 模拟3D效果(和手机浏览图片效果相似)(附源码) pf的3D是一个很有意思的东西,类似于ps的效果,类似于电影动画的效果,因为动画的效果,(对于3D基础的摄像机,光源,之类不介绍,对于依赖属性也不介绍.),个人认为,依赖属性这个东西,有百分之五十是为了3D而存在.(自己写的类似于demo的东西)先上图,无图无真相这是demo的整个效果图,可以用鼠标移动,触摸屏也可以手指滑动,图片会移动,然后移动结束,会有一个回弹的判断. <Window x:Class="_3Dshow.Wi

WPF 图片浏览 伪3D效果

原文:WPF 图片浏览 伪3D效果 首先上效果图: 因项目要求,需要把图片以"好看"."炫"的效果展示出来,特地研究了一下WPF关于3D方面的制作,奈何最终成果只是能够画出一个立方体并使之旋转. 项目时间仅剩两天,只好放弃3D另找出路,于是就想起了Flash中各种"炫丽"的动画效果,图片按椭圆排列,并且旋转. 于是开始代码,然后发现关于椭圆啊.正玄余玄.x,y,r等等数学知识都忘得光光了,仅有思路没有进展,无奈之下开始百度恶补数学知识.图形变换.

CSS3实现3D效果的图片墙

先来看一下效果:http://1.huizit1.applinzi.com/CSS/transform_3D/img_3D.html 布局结构: <div class="container"> <img src="../Img/1.jpg"> <img src="../Img/2.jpg"> <img src="../Img/3.jpg"> <img src=".

3d效果的图片轮播

CSS3的3d变换 CSS3给我们提供了一个新的功能,那就是3d变换.3d变换和2d变换的基本API函数类似,只不过多了些在Z轴上的操作,不难使用. 但是,为了让元素拥有3d变换的功能,我们需要给他的父元素设置相应的变换属性.与其相关的属性为perspective和transform-style.在新版的Chrome中已不需要添加私有前缀,不过为了兼容之前版本的浏览器,建议还是加上私有前缀(本例中并未添加私有前缀). perspective属性取值为:none|number.当值为数字时,意味着

iOS开发中的错误整理,启动图片设置了没有效果;单独创建xib需要注意的事项;图片取消系统渲染的快捷方式

一.启动图片设置了没有效果 解决方案:缓存啊!卸了程序重新安装吧!!!!! 二.单独创建xib需要注意的事项 三.图片取消系统渲染的快捷方式

实现图片旋转木马3D浏览效果

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8&

WPF技术触屏上的应用系列(四): 3D效果图片播放器(图片立体轮放、图片立体轮播、图片倒影立体滚动)效果实现

原文:WPF技术触屏上的应用系列(四): 3D效果图片播放器(图片立体轮放.图片立体轮播.图片倒影立体滚动)效果实现 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7操作系统,54寸大屏电脑电视一体机.要求有很炫的展示效果,要有一定的视觉冲击力,可触控操作.当然满足客户的要求也可以有其它途径.但鉴于咱是搞 .NET技术的,首先其冲想到的微软WPF方面,之前对WPF的了解与学习也只是停留在比较浅的层面,没有进一步深入学习与应用.所以在项目接来以后,也就赶鸭子上架了

纯css实现照片墙3D效果

每张照片都有美丽的故事.美好的回忆.家居中的照片墙则帮你展现出这些承载着家庭重要记忆的照片,除了用画框装饰照片挂在墙上外,照片墙还可以演变为手绘照片墙.也经常在网上看到一些关于照片墙的特效案例,决定自己动手试试. v直接上代码 这篇博客呢就是演示一个照片墙的效果.所以废话不多说,直接上代码然后展示特效.有兴趣的道友可以自己练练手试试.也可以改动改动其中的属性多玩玩,自己测试的时候建议用美女的照片,绝对"乐在其中". 1.准备材料:  准备材料就是没什么材料,自己麻溜赶快的去:百度找几张

手机端图片滑动切换效果

最近公司要求开发wap版本页面,碰到了个图片滑动切换效果,折腾了半天,自己封装了一个比较通用的小控件,在此分享一下. 大概功能:可以自定义是否自动切换,支持单手滑动图片进行切换,支持左右滑动切换.循环切换等等,具体可以拿demo代码自己本地试试,注意只支持手机端哦 大概思路:通过touchstart.touchmove.touchend 三个事件加上css3的3d变化效果配合,实现滑动切换图片, 开发是基于Zepto框架,当然也支持其他任何一款手机端框架,只需将代码中的美元符号$换为指定框架操作