把图片变换颜色!

原创 2005年05月26日 00:28:00

class ImageCanvas
      extends Canvas {
    byte[] b;
    int imagelength;
    Image i;
    ImageCanvas() {
      imageRGBConvertInit();
      try {
        b = readImageToBytesEasy("/1.png", is);//Zane 40
//Zane  b = readImageToBytes("/1.png", is);//Zane 60
//Zane  b = readImageToBytes("/1.png", is,2355);//Zane 通用的
      }
      catch (IOException ioe) {}

      b = imageRGBConvert(b, 0, 0, 0, 0, 255, 0);
      if(b==null)
        System.out.println("Image file do not contain this COLOR!");
      try {
        i = Image.createImage(b, 0, b.length);
      }
      catch (Exception e) {
        System.out.println(e + "CREATEIMAGE");
      }
    }

    public void paint(Graphics g) {
      g.setColor(0, 0, 0);
      g.fillRect(0, 0, getWidth(), getHeight());
      g.drawImage(i, getWidth() / 2, getHeight() / 2, g.VCENTER | g.HCENTER);
    }

    public byte[] imageRGBConvert(byte[] image, int R, int G, int B, int cR,
                                  int cG, int cB) {
      int i;
      int crc;
      int length = 0;
      int temp;
      String[] sIDAT = {
          "49", "44", "41", "54"};
      String[] sPLTE = {
          "50", "4c", "54", "45"};
      int cnt = 0;
      if (image[1] != 0x50 ||
          image[2] != 0x4e ||
          image[3] != 0x47 ||
          image[4] != 0x0d ||
          image[5] != 0x0a ||
          image[6] != 0x1a ||
          image[7] != 0x0a) {
        System.out.println("INCORRECT");
        return null;
      }
      while (true) {
        for (i = 0; i < image.length; i++) {
          if (Integer.toHexString(image[i]).equals(sPLTE[cnt])) {
            cnt++;
            if (cnt >= 4) {
              for (int j = 4; j > 0; j--) {
                if (image[i - j - 3] != 0x00) {
                  switch (j) {
                    case 4:
                      length = image[i - j - 3] * 0xffffff;
                      break;
                    case 3:
                      length = image[i - j - 3] * 0xffff;
                      break;
                    case 2:
                      length = image[i - j - 3] * 0xff;
                      break;
                    case 1:
                      length = image[i - j - 3] * 1;
                      break;
                    default:
                      length = -1;
                      System.out.println("length ERROR!");
                      break;
                  }
                }
              }
              if(!changeColor(image, length, i + 1, R, G, B, cR, cG, cB))
                return null;//Zane 图片里没有这个颜色。
              cnt = 0;
              break;
            }
          }
          else {
            if (Integer.toHexString(image[i]).equals(sIDAT[cnt])) {
              cnt++;
              if (cnt >= 4) {
                System.out.println(
                    "This file do NOT contain PLTE!!!You should recreate your PNG file.");
                break;
              }
            }
            else {
              if (cnt != 0) {
                cnt = 0;
              }
              continue;
            }
          }
        }
        break;
      }

      crc = updateCRC(image, i - 3, length + 4);
      image[i + length + 4] = (byte) (crc >>> 0);
      image[i + length + 3] = (byte) (crc >>> 8);
      image[i + length + 2] = (byte) (crc >>> 16);
      image[i + length + 1] = (byte) (crc >>> 24);
      System.out.println("CRC==" + Integer.toHexString(crc));

      return image;
    }

    public byte[] readImageToBytes(String url, InputStream is, int length) throws
        IOException { //Zane 通用的,效率高
      System.out.println("readImageToBytes LENGTH");
      byte[] ref;
      is = getClass().getResourceAsStream(url);
      //System.out.println(is.available());
      ref = new byte[length];
      is.read(ref);
      is.close();
      System.gc();
      return ref;
    }

    public byte[] readImageToBytesEasy(String url, InputStream is) throws
        IOException { //Zane for 40 效率低

      byte[] ref;
      is = getClass().getResourceAsStream(url);
      int length = 0;
      while (is.read() != -1) {
        length++;
      }
      System.out.println("length==" + length);

      is = getClass().getResourceAsStream(url);
      ref = new byte[length];
      is.read(ref);
      is.close();
      System.gc();
      return ref;

    }

    public byte[] readImageToBytes(String url, InputStream is) throws
        IOException { //Zane for 60 , 在60上支持is.available()
      byte[] ref;
      is = getClass().getResourceAsStream(url);
      ref = new byte[is.available()];
      is.read(ref);
      is.close();
      System.gc();
      return ref;

    }

    public boolean changeColor(byte[] image, int length, int i, int r, int g,
                               int b, int r1,
                               int g1, int b1) {
      int temp = i;
      while (true) {
        if (i - temp > length) {
          return false;
        }
          if (image[i] == getValue(r) && image[i + 1] == getValue(g) &&
            image[i + 2] == getValue(b)) {
          image[i] = getValue(r1);
          image[i + 1] = getValue(g1);
          image[i + 2] = getValue(b1);
          return true;
        }
        else {
          i += 3;
        }
      }
    }

    public byte getValue(int i) {
      return i <= -1 ? (byte) (i + 256) : (byte) (i);
    }
  }

//Zane 重新生成CRC校验

  static int[] crcTable = new int[256];
  public void imageRGBConvertInit() {
    // Initialize CRC table
    for (int n = 0; n < 256; n++) {
      int c = n;
      for (int k = 0; k < 8; k++) {
        if ( (c & 1) == 1) {
          c = 0xedb88320 ^ (c >>> 1);
        }
        else {
          c >>>= 1;
        }

        crcTable[n] = c;
      }
    }
  }

  public int updateCRC(byte[] data, int off, int len) {
    int c = 0xffffffff;

    for (int n = 0; n < len; n++) {
      c = crcTable[ (c ^ data[off + n]) & 0xff] ^ (c >>> 8);
    }

    return c ^ 0xffffffff;
  }

 

Paint设置过滤器更变图片整体颜色效果

还是老规矩,先看效果,因为个人感觉如果你写半天代码根据不知道自己最后要实现什么样的效果是一个非常痛苦的事情; 如果单说实现点击图片变色效果,有很多中实现方式; 最简单的就是准备两张图片,通过点击切换两...
  • Zheng_Jiao
  • Zheng_Jiao
  • 2016年06月18日 18:26
  • 1238

oc 图片变黑白

理论依据: 所谓颜色或灰度级指黑白显示器中显示像素点的亮暗差别,在彩色显示器中表现为颜色的不同,灰度级越多,图像层次越清楚逼真。灰度级取决于每个像素对应的刷新存储单元的位数和显示器本...
  • u013406800
  • u013406800
  • 2018年01月04日 14:13
  • 61

MATLAB图像处理_直接操作像素点进行颜色变换

需求 直接操作RGB图像的像素点,进行颜色的相关操作。 掌握这个,必须对MATLAB中矩阵的操作有所熟悉,特别是整行、整列的操作。 如: 代码如下: ....
  • scottly1
  • scottly1
  • 2014年12月29日 08:44
  • 6376

Cocos2d-js 3.0 颜色变换(调整sprite/图片的色调)

Flash在滤镜方面做得比较成熟,starling也有很多现成的办法。 但Cocos2D这里就显得比较单薄,百度/谷歌很少相关资料。 后续如果有时间,再慢慢整理各种滤镜效果。     ...
  • oMingZi12345678
  • oMingZi12345678
  • 2014年12月25日 18:22
  • 1763

C#图片处理之:色彩调整

上面有一篇提到了图片明暗的调整,其原理是每个象素的三个颜色分量同时增加或减少一个固定的值。现在更进一步,假如每个象素三个分量增加或减少的值不是相同的呢?嗯,这就今天要讨论的主题了。应该很容易想明白,假...
  • ki1381
  • ki1381
  • 2007年04月25日 18:58
  • 5828

把颜色转成图片

func imageFromColor(color: UIColor) -> UIImage {         let rect: CGRect = CGRectMake(0, 0, view.f...
  • cjb1224_0513
  • cjb1224_0513
  • 2016年11月18日 16:48
  • 98

《慢慢学TensorFlow》微信公众号之TensorFlow 图像数据预处理及可视化

注:文章转自《慢慢学TensorFlow》微信公众号 图像是人们喜闻乐见的一种信息形式,“百闻不如一见”,有时一张图能胜千言万语。图像处理是利用计算机将数值化的图像进行一定(线性或非线性)变...
  • chaihuimin
  • chaihuimin
  • 2017年05月08日 11:21
  • 426

纯css svg 改变图片颜色 ios android 小程序

本文出自: http://blog.csdn.net/wyk304443164 使用的是 filter drop-shadow 如果你只想兼容 Chrome 那么请看: http://www...
  • wyk304443164
  • wyk304443164
  • 2017年11月28日 18:13
  • 169

如何将图片中的某一种颜色全部用另一种颜色代替

最近遇到此需求,后悔当初选修课没好好学PS。。。。。。 我是用下面的方法解决的: 图像--调整--替换颜色--选中带+号的那个吸管--单击要被替换的颜色--设置新的颜色 搞定。。。。。。...
  • nanfeiyannan
  • nanfeiyannan
  • 2011年10月23日 17:20
  • 5136

PS图片中字体或图像的颜色替换

第一步、打开替换颜色修改框。步骤:图像——调整——替换颜色  第二部、选择要替换的颜色 完后点确定,就可以修改好自己想要的颜色。...
  • zsj523
  • zsj523
  • 2015年03月12日 11:28
  • 9205
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:把图片变换颜色!
举报原因:
原因补充:

(最多只允许输入30个字)