注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

千鸟

本blog所有日志均系原创 转载请注明出处

 
 
 

日志

 
 

基于MemoryImageSource高性能动画  

2007-08-08 15:56:05|  分类: jphotoshop |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

源代码下载地址: http://soulnew.googlepages.com/MemoryImageSource.rar

邮件:soulnew@gmail.com

(代码包副赠: 自家造的简单卷积器:MyConvolveOp.java  (java 2d 提供的卷积器不提供象素数组支持-_-||| ) )

基于MemoryImageSource高性能动画 - souljava - 千鸟基于MemoryImageSource高性能动画 - souljava - 千鸟 

 

众所周知java绘制静态的象,用BufferedImage是很高效的

但是要绘制动态图像,对每张新图生成一个BufferedImage是相当浪费资源的.那怎么办了, 刚好这几天在研究如何把int[] 数组中的象素快速绘制处理. 

^_^ ok,下面是MemoryImageSource 高效用法,我保证你怎么google都找不到(因为在下试过.....)其实就一点点巧妙的地方

MemoryImageSource 是BufferedImage 的一个元素,用于保存象素信息的

先看段API 里的代码

 int pixels[];
        MemoryImageSource source;

        public void init() {
            int width = 50;
            int height = 50;
            int size = width * height;
            pixels = new int[size];

            int value = getBackground().getRGB();
            for (int i = 0; i < size; i++) {
                pixels[i] = value;
            }

            source = new MemoryImageSource(width, height, pixels, 0, width);
            source.setAnimated(true);
            image = createImage(source);
        }

        public void run() {
            Thread me = Thread.currentThread( );
            me.setPriority(Thread.MIN_PRIORITY);

            while (true) {
                try {
                    thread.sleep(10);
                } catch( InterruptedException e ) {
                    return;
                }

                // Modify the values in the pixels array at (x, y, w, h)

                // Send the new data to the interested ImageConsumers
                source.newPixels(x, y, w, h);
            }
        }

 很明显 source.newPixels(x, y, w, h); 是通知BufferedImage 象素多大范围内象素发生了更新.

那怎么更新象素了?

还好int[] 是可变的, 就是说只要外部修改了int[]里面的东西, MemoryImageSource内部里的数据也会相应的发生变化.  那问题现在就超简单了.

只要修改 int[],然后调用 source.newPixels(x, y, w, h); 就ok了

注意int[] 的修改方法

pixels[i] = value; 可以

pixels = new int[]  不可以,其中由头,只要知道java非基本类型是引用就ok了.

 

下面是卷积器的说明

要是你没有卷积算子就调用这方法:  默认使用锐化卷积

public void getOP(int[][] image, int[][] toFill) {

要是你有卷积算子

public void getOP(int[][] image, float[][] kenel, int[][] toFill) {

这个卷积器, 对象素数组边缘一圈没做卷积处理,大于0xff的单个色彩制为0xff,小于0的置为0;  详细算法见 数字图像处理,代码很长,算法很简单ok

 

 

 

 

 

  评论这张
 
阅读(1507)| 评论(2)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017