在Java中使用我的自定义色彩映射图像

时间:2010-05-07 15:36:58

标签: java graphics image jpeg

我有一个问题是通过索引来构思彩色图像。

我在

上尝试了这个代码
  

http://www.podgoretsky.pri.ee/ftp/Docs/Java/Tricks%20of%20the%20Java%20Programming%20Gurus/ch12.htm

// Gradient.java
// Imports
import java.applet.Applet;
import java.awt.*;
import java.awt.image.*;

public class Gradient extends Applet {
  final int colors = 32;
  final int width = 200;
  final int height = 200;
  Image img;

  public void init() {
    // Create the color map
    byte[] rbmap = new byte[colors];
    byte[] gmap = new byte[colors];
    for (int i = 0; i < colors; i++)
      gmap[i] = (byte)((i * 255) / (colors - 1));

    // Create the color model
    int bits = (int)Math.ceil(Math.log(colors) / Math.log(2));
    IndexColorModel model = new IndexColorModel(bits, colors,
      rbmap, gmap, rbmap);

    // Create the pixels
    int pixels[] = new int[width * height];
    int index = 0;
    for (int y = 0; y < height; y++)
      for (int x = 0; x < width; x++)
        pixels[index++] = (x * colors) / width;

    // Create the image
    img = createImage(new MemoryImageSource(width, height, model,
      pixels, 0, width));
  }

  public void paint(Graphics g) {
    g.drawImage(img, 0, 0, this);
  }
}

它工作得很好,但我尝试加载映射在我自己的色彩映射上的自定义图像jpeg,但它没有正常工作。我只看到一堆绿色和蓝色的像素画在白色背景上。 我的自定义颜色映射方法在这里:

public void inintByteArrays() {
  double[][] c = // basic color map
  { { 0.0000, 0.0000, 0.5625 }, { 0.0000, 0.0000, 0.6250 },
    { 0.0000, 0.0000, 0.6875 }, { 0.0000, 0.0000, 0.6875 },
    { 0.0000, 0.0000, 0.7500 }, { 0.0000, 0.0000, 0.8125 },
    { 0.0000, 0.0000, 0.8750 }, { 0.0000, 0.0000, 0.9375 },
    { 0.0000, 0.0000, 1.0000 }, { 0.0000, 0.0625, 1.0000 },
    { 0.0000, 0.1250, 1.0000 }, { 0.0000, 0.1875, 1.0000 },
    { 0.0000, 0.2500, 1.0000 }, { 0.0000, 0.3125, 1.0000 },
    { 0.0000, 0.3750, 1.0000 }, { 0.0000, 0.4375, 1.0000 },
    { 0.0000, 0.5000, 1.0000 }, { 0.0000, 0.5625, 1.0000 },
    { 0.0000, 0.6250, 1.0000 }, { 0.0000, 0.6875, 1.0000 },
    { 0.0000, 0.7500, 1.0000 }, { 0.0000, 0.8125, 1.0000 },
    { 0.0000, 0.8750, 1.0000 }, { 0.0000, 0.9375, 1.0000 },
    { 0.0000, 1.0000, 1.0000 }, { 0.0625, 1.0000, 0.9375 },
    { 0.1250, 1.0000, 0.8750 }, { 0.1875, 1.0000, 0.8125 },
    { 0.2500, 1.0000, 0.7500 }, { 0.3125, 1.0000, 0.6875 },
    { 0.3750, 1.0000, 0.6250 }, { 0.4375, 1.0000, 0.5625 },
    { 0.5000, 1.0000, 0.5000 }, { 0.5625, 1.0000, 0.4375 },
    { 0.6250, 1.0000, 0.3750 }, { 0.6875, 1.0000, 0.3125 },
    { 0.7500, 1.0000, 0.2500 }, { 0.8125, 1.0000, 0.1875 },
    { 0.8750, 1.0000, 0.1250 }, { 0.9375, 1.0000, 0.0625 },
    { 1.0000, 1.0000, 0.0000 }, { 1.0000, 0.9375, 0.0000 },
    { 1.0000, 0.8750, 0.0000 }, { 1.0000, 0.8125, 0.0000 },
    { 1.0000, 0.7500, 0.0000 }, { 1.0000, 0.6875, 0.0000 },
    { 1.0000, 0.6250, 0.0000 }, { 1.0000, 0.5625, 0.0000 },
    { 1.0000, 0.5000, 0.0000 }, { 1.0000, 0.4375, 0.0000 },
    { 1.0000, 0.3750, 0.0000 }, { 1.0000, 0.3125, 0.0000 },
    { 1.0000, 0.2500, 0.0000 }, { 1.0000, 0.1875, 0.0000 },
    { 1.0000, 0.1250, 0.0000 }, { 1.0000, 0.0625, 0.0000 },
    { 1.0000, 0.0000, 0.0000 }, { 0.9375, 0.0000, 0.0000 },
    { 0.8750, 0.0000, 0.0000 }, { 0.8125, 0.0000, 0.0000 },
    { 0.7500, 0.0000, 0.0000 }, { 0.6875, 0.0000, 0.0000 },
    { 0.6250, 0.0000, 0.0000 }, { 0.5625, 0.0000, 0.0000 },
    { 0.5000, 0.0000, 0.0000 } };

  for (int i = 0; i < c.length; i++) {

   for (int j = 0; j < c[i].length; j++) {
    if (j == 0)
     r[i] = (byte) ((byte) c[i][j]*255);
    if (j == 1)
     g[i] = (byte) ((byte) c[i][j]*255);
    if (j == 2)
     b[i] = (byte) ((byte) c[i][j]*255);
   }
  }

我的问题是如何将我的色彩映射用于我想要以正确方式加载和映射的任何图像。非常感谢你!

问候,蛋白质1。

1 个答案:

答案 0 :(得分:0)

Jpegs不使用索引颜色,它们存储RGB值。

您想达到什么效果?例如,您可以将JPEG转换为灰度,将灰度存储为索引,然后使用颜色映射。