j2me上面实现图片的特效

 最近需要完成一个在j2me上面实现图片的特效 (缩放,裁剪,调整大小,镜像,对比度亮度调整,黑白,线条,粉笔画,蒙版)等功能,于是写了一些算法完成了以上功能,系统条件:MIDP2.0,cldc1.1

代码如下:

ImageUtil

/*
 * ImageUtil.java
 *
 * Created on 2008年1月11日, 上午9:26
 *
 */


/**
 *
 * @author alajl
 */


import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.Sprite;


public class ImageUtil
{
    public static final int TURN_LEFT = 1;
    public static final int TURN_RIGHT = 2;


    /*
    *获取图片RGB数据,并返回大小为width*height大小的一维数组
    */
    public int[] getPixels(Image src)
    {
        int w = src.getWidth();
        int h = src.getHeight();
        int[] pixels = new int[w * h];
        src.getRGB(pixels, 0, w, 0, 0, w, h);
        return pixels;
    }

 
    /*
    *将pixels[]里的数据,生成一张图片,图片宽为w,高为h
    */
    public Image drawPixels(int[] pixels, int w, int h)
    {
        Image image = Image.createRGBImage(pixels, w, h, true);
        pixels = null;
        return image;
    }


    /*
    *调整图片大小
    *destW 调整后的宽,destH调整后的高
    */ 
    public  Image effect_resizeImage(Image src, int destW, int destH)
    {
        int srcW = src.getWidth();
        int srcH = src.getHeight();

 
        int[] destPixels = new int[destW * destH];
       
        int[] srcPixels = getPixels(src);

            for (int destY = 0; destY < destH; ++destY)
            {
                for (int destX = 0; destX < destW; ++destX)
                {
                    int srcX = (destX * srcW) / destW;
                    int srcY = (destY * srcH) / destH;
                    destPixels[destX + destY * destW] = srcPixels[srcX + srcY
                            * srcW];
                }
            }

 
        return drawPixels(destPixels, destW, destH);
    }

  
   /*
   * 调整图片亮度与对比度。  contrast 对比度,light 亮度
   */
   public Image effect_light_contrast(Image src,double contrast,int light)
   {
            int srcW = src.getWidth();
            int srcH = src.getHeight(); 
            int[] srcPixels = getPixels(src);
            int r = 0;
            int g = 0;
            int b = 0;
            int a = 0;
            int argb;
     //公式y =ax+b   a为对比度,b为亮度
     //int para_b  = light - 127 * (light - 1);
     for (int i = 0; i < srcH; i++)
           {
              for(int ii=0;ii<srcW;ii++)
        {
                      argb = srcPixels[i*srcW+ii]; 
        a = ((argb & 0xff000000) >> 24); // alpha channel
                      r =((argb & 0x00ff0000) >> 16); // red channel
                      g =((argb & 0x0000ff00) >> 8); // green channel
                      b =(argb & 0x000000ff); // blue channel
                      r =(int)( r*contrast+light);                    
        g =(int)( g*contrast+light);
        b =(int)( b*contrast+light);
                    
         /*r =(int)((r -127 ) * contrast + 127+para_b);
         g =(int)((g -127 ) * contrast + 127+para_b);
         b =(int)((b -127 ) * contrast + 127+para_b);*/
         if(r>255)
                               r = 255;
                       else if(r<0) r=0;
                       if(g>255)
                               g = 255;
                       else if(g<0) g=0;
                       if(b>255)
                               b = 255;
                       else if(b<0) b=0;
               srcPixels[i*srcW+ii] = ((a << 24) | (r << 16) | (g << 8) | b);

        }
     }
         return drawPixels(srcPixels, srcW, srcH);
   }
 
 
    /*
   * 图片镜像特效
   */
    public Image effect_mirror(Image src)
    {
          int srcW = src.getWidth();
          int srcH = src.getHeight(); 
          int[] srcPixels = getPixels(src);
          int len;
          int temp;
          for (int i = 0; i < srcH; i++)
          {
              len = (i+1)*srcW;
              for(int ii=0;ii<srcW/2;ii++)
              {  
                 temp=srcPixels[i*srcW+ii];
                 srcPixels[i*srcW+ii]=srcPixels[len-1-ii];
                 srcPixels[len-1-ii]=temp;
              }
           }
           return drawPixels(srcPixels, srcW, srcH);
    }

      /*
   * 图片剪切,cut_xpos,cut_ypos 切割框的起始位置坐标,cut_width,cut_height 切割框的宽与高
   */
    public Image effect_cut(Image src,int cut_xpos,int cut_ypos,int cut_width,int cut_height)
    {
          int srcW = src.getWidth();
          int srcH = src.getHeight(); 
          int[] srcPixels = getPixels(src);
          int[] desPixels = new int[cut_width*cut_height];
          int argb;
   int num = 0;
          for (int i = 0; i < srcH; i++)
          {
            if(i >= cut_ypos&&i<cut_height+cut_ypos)
            {
                 for(int ii=0;ii<srcW;ii++)
          {
                    if(ii>=cut_xpos && ii<cut_width+cut_xpos)
      {
                         desPixels[num] = srcPixels[i*srcW+ii];   
                         num++;
                        
        }
   }
             }
         }
           return drawPixels(desPixels, cut_width, cut_height);
    }


    /*
   * 图片叠加,将src和image合成一张图片,x_pos,y_pos一般为0,0,也可以为自定义值
   */
    public Image effect_image_add_image(Image src,Image image,int x_pos,int y_pos)
    {  
             Image temp  = Image.createImage(src.getWidth(),src.getHeight());
      Graphics g = temp.getGraphics();
             //g.drawImage(src,x_pos,y_pos,Graphics.LEFT|Graphics.TOP);
      //g.drawImage(image,x_pos,y_pos,Graphics.LEFT|Graphics.TOP);*/
             int alpha = 168;
             int []srcRgbdata   =   new   int[src.getWidth()*src.getHeight()];  
             int []desRgbdata   =   new   int[image.getWidth()*image.getHeight()]; 
             src.getRGB(srcRgbdata,0,src.getWidth(),0,0,src.getWidth(),src.getHeight());  
             image.getRGB(desRgbdata,0,image.getWidth(),0,0,image.getWidth(),image.getHeight());   
             g.drawRGB(getTransImg(alpha,srcRgbdata,desRgbdata),0,src.getWidth(),0,0,src.getWidth(),src.getHeight(),false);  
             src=null;  
             image=null; 
             return temp;
    }
   
     /*
   * 图片上添加字符
   */
    public Image effect_image_add_str(Image src,String str,int x_pos,int y_pos)
    {
             Image temp = Image.createImage(src.getWidth(),src.getHeight());
      Graphics g = temp.getGraphics();
             g.drawImage(src,0,0,Graphics.LEFT|Graphics.TOP);
             g.setColor(0x000000);
   g.drawString(str,x_pos,y_pos,Graphics.LEFT|Graphics.TOP);
             return temp;
    }
 
     /*
   * 图片特效负片
   */
    public Image effect_negative(Image src)
    {
         int srcW = src.getWidth();
         int srcH = src.getHeight(); 
         int[] srcPixels = getPixels(src);
         int r = 0;
         int g = 0;
         int b = 0;
         int a = 0;
         int argb;  
         for (int i = 0; i < srcH; i++)
         {
              for(int ii=0;ii<srcW;ii++)
        {
   argb = srcPixels[i*srcW+ii];
                        a = ((argb & 0xff000000) >> 24); // alpha channel
                        r =255-((argb & 0x00ff0000) >> 16); // red channel
                        g =255-((argb & 0x0000ff00) >> 8); // green channel
                        b =255-(argb & 0x000000ff); // blue channel
                        srcPixels[i*srcW+ii] = ((a << 24) | (r << 16) | (g << 8) | b);
        }
         }
        return drawPixels(srcPixels, srcW, srcH);

        
    }

      /*
   * 图片特效黑白
   */
     public Image effect_black_white(Image src)
    {
         int srcW = src.getWidth();
         int srcH = src.getHeight(); 
         int[] srcPixels = getPixels(src);
         int r = 0;
         int g = 0;
         int b = 0;
         int a = 0;
         int argb;
         int temp;
         
         for (int i = 0; i < srcH; i++)
         {
              for(int ii=0;ii<srcW;ii++)
        {
   argb = srcPixels[i*srcW+ii];
                        a = ((argb & 0xff000000) >> 24); // alpha channel
                        r = ((argb & 0x00ff0000) >> 16); // red channel
                        g = ((argb & 0x0000ff00) >> 8); // green channel
                        b = (argb & 0x000000ff); // blue channel
                        temp = (int)(.299*(double)r+.587*(double)g+.114*(double)b);
                        r = temp;
                        g = temp;
                        b = temp;
                        srcPixels[i*srcW+ii] = ((a << 24) | (r << 16) | (g << 8) | b);
        }
         }
        return drawPixels(srcPixels, srcW, srcH);

        
    }
    
      /*
   * 图片特效粉笔画
   */
     public Image effect_crayon(Image src)
     {
         int srcW = src.getWidth();
         int srcH = src.getHeight(); 
         int[] srcPixels = getPixels(src);
         int r = 0;
         int g = 0;
         int b = 0;
         int a = 0;
         int argb;  
         int r1 = 0;
         int g1 = 0;
         int b1 = 0;
         int a1 = 0;
         int r2 = 0;
         int g2 = 0;
         int b2 = 0;
         int a2 = 0;
        
         for (int i = 0; i < srcH; i++)
         {
              for(int ii=0;ii<srcW;ii++)
       {
                  argb = srcPixels[i*srcW+ii];
                  a = ((argb & 0xff000000) >> 24); // alpha channel
                  r = ((argb & 0x00ff0000) >> 16); // red channel
                  g = ((argb & 0x0000ff00) >> 8); // green channel
                  b = (argb & 0x000000ff); // blue channel
                  if(i+1 == srcH)
                  {
                       r1= 0;
                       g1= 0;
                       b1=0;
                  }
                  else
                  {
                     argb = srcPixels[(i+1)*srcW+ii];
                     //a1 = ((argb & 0xff000000) >> 24); // alpha channel
                     r1 = ((argb & 0x00ff0000) >> 16); // red channel
                     g1 = ((argb & 0x0000ff00) >> 8); // green channel
                     b1 = (argb & 0x000000ff); // blue channel
                  }
                  if(ii+1 == srcW){
                       r2= 0;
                       g2= 0;
                       b2=0;
                  }
                  else
                  {
                      argb = srcPixels[i*srcW+ii+1];
                      r2 = ((argb & 0x00ff0000) >> 16); // red channel
                      g2 = ((argb & 0x0000ff00) >> 8); // green channel
                      b2 = (argb & 0x000000ff); // blue channel
                  }
                 // rr1=(r1-r2)^2  rr2=(r1-r3)^2
                  r = (int)Math.sqrt((double)(2*(r-r1)*(r-r1)+(r-r2)*(r-r2)));
                  g = (int)Math.sqrt((double)(2*(g-g1)*(g-g1)+(g-g2)*(g-g2)));
                  b = (int)Math.sqrt((double)(2*(b-b1)*(b-b1)+(b-b2)*(b-b2)));
                  r =255-r; // red channel
                  g =255-g; // green channel
                  b =255-b; // blue channel
                  srcPixels[i*srcW+ii] = ((a << 24) | (r << 16) | (g << 8) | b);
              }
         }
         return drawPixels(srcPixels, srcW, srcH);
     }
    
         /*
   * 图片特效蒙版
   */
      public Image effect_hoodwink(Image src)
    {
         int srcW = src.getWidth();
         int srcH = src.getHeight(); 
         int[] srcPixels = getPixels(src);
         int r = 0;
         int g = 0;
         int b = 0;
         int a = 0;
         int argb;

         
         for (int i = 0; i < srcH; i++)
         {
              for(int ii=0;ii<srcW;ii++)
        {
   argb = srcPixels[i*srcW+ii];
                        a = ((argb & 0xff000000) >> 24); // alpha channel
                        r = ((argb & 0x00ff0000) >> 16); // red channel
                        g = ((argb & 0x0000ff00) >> 8); // green channel
                        b = (argb & 0x000000ff); // blue channel
                        r = (int)(.299*(double)r);
                        g = (int)(.587*(double)g);
                        b = (int)(.114*(double)b);
                        srcPixels[i*srcW+ii] = ((a << 24) | (r << 16) | (g << 8) | b);
        }
         }
        return drawPixels(srcPixels, srcW, srcH);

        
    }
    
    private   int[]   getTransImg(int alpha,int[] srcRgbdata,int[] desRgbdata)  
    {   
           int []   tempRgbData = new int[desRgbdata.length];  
       
           int   sr  ;
           int   sg ;
           int   sb ;
           int   dr  ; 
           int   dg ;
           int   db ;
           int   tr  ;
           int   tg  ;
           int   tb  ;
           for(int   i=0;i<desRgbdata.length;i++)  
           {  
              sr   =   (srcRgbdata[i]&0xff0000)>>16;  
              sg   =   (srcRgbdata[i]&0xff00)>>8;  
              sb   =   srcRgbdata[i]&0xff;  
              dr   =   (desRgbdata[i]&0xff0000)>>16;  
              dg   =   (desRgbdata[i]&0xff00)>>8;  
              db   =   desRgbdata[i]&0xff;  
              tr   =   (sr*alpha   +   dr*(255-alpha))/255;  
              tg   =   (sg*alpha   +   dg*(255-alpha))/255;  
              tb   =   (sb*alpha   +   db*(255-alpha))/255;    
              tempRgbData[i]   =   (tr<<16)|(tg<<8)|tb;  
           }  
         return   tempRgbData;  
       }
   
         /*
   * 图片特旋转
   */
    public Image effect_rotate(Image src,int direction)
    {
        Sprite sprite = new Sprite(src);
        switch(direction)
        {
                  case 1:
                            sprite.setTransform(sprite.TRANS_ROT270);
                            break;
                  case 2:
                            sprite.setTransform(sprite.TRANS_ROT90);  
                            break;
        }
      
        Image temp = Image.createImage(src.getHeight(),src.getWidth());
  Graphics g = temp.getGraphics();
        sprite.setPosition(0,0);
        sprite.paint(g);
        return temp;  
     }

   
  

       /*
   * 图片特霓虹灯
   */
    public Image effect_neonLight(Image src)
    {
         int srcW = src.getWidth();
         int srcH = src.getHeight(); 
         int[] srcPixels = getPixels(src);
         int r = 0;
         int g = 0;
         int b = 0;
         int a = 0;
         int argb;  
         int r1 = 0;
         int g1 = 0;
         int b1 = 0;
         int a1 = 0;
         int r2 = 0;
         int g2 = 0;
         int b2 = 0;
         int a2 = 0;
        
         for (int i = 0; i < srcH; i++)
         {
              for(int ii=0;ii<srcW;ii++)
       {
                  argb = srcPixels[i*srcW+ii];
                  a = ((argb & 0xff000000) >> 24); // alpha channel
                  r = ((argb & 0x00ff0000) >> 16); // red channel
                  g = ((argb & 0x0000ff00) >> 8); // green channel
                  b = (argb & 0x000000ff); // blue channel
                  if(i+1 == srcH)
                  {
                       r1= 0;
                       g1= 0;
                       b1=0;
                  }
                  else
                  {
                     argb = srcPixels[(i+1)*srcW+ii];
                     //a1 = ((argb & 0xff000000) >> 24); // alpha channel
                     r1 = ((argb & 0x00ff0000) >> 16); // red channel
                     g1 = ((argb & 0x0000ff00) >> 8); // green channel
                     b1 = (argb & 0x000000ff); // blue channel
                  }
                  if(ii+1 == srcW){
                       r2= 0;
                       g2= 0;
                       b2=0;
                  }
                  else
                  {
                      argb = srcPixels[i*srcW+ii+1];
                      r2 = ((argb & 0x00ff0000) >> 16); // red channel
                      g2 = ((argb & 0x0000ff00) >> 8); // green channel
                      b2 = (argb & 0x000000ff); // blue channel
                  }
                 // rr1=(r1-r2)^2  rr2=(r1-r3)^2
                  r = (int)Math.sqrt((double)(2*(r-r1)*(r-r1)+(r-r2)*(r-r2)));
                  g = (int)Math.sqrt((double)(2*(g-g1)*(g-g1)+(g-g2)*(g-g2)));
                  b = (int)Math.sqrt((double)(2*(b-b1)*(b-b1)+(b-b2)*(b-b2)));
                  srcPixels[i*srcW+ii] = ((a << 24) | (r << 16) | (g << 8) | b);
              }
         }
         return drawPixels(srcPixels, srcW, srcH);
    }

}

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/alajl/archive/2008/04/12/2284924.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值