e660. 用一组像素创建图像

Posted borter

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了e660. 用一组像素创建图像相关的知识,希望对你有一定的参考价值。

This example demonstrates how to convert a byte array of pixel values that are indices to a color table into an Image. In particular, the example generates the Mandelbrot set in a byte buffer and uses the MemoryImageSource image producer to create an image from the pixel data in the byte buffer. A 16-color index color model is used to represent the pixel colors.

    import java.awt.*;
    import java.awt.event.*;
    import java.awt.geom.*;
    import java.awt.image.*;
    
    // Instantiate this class and then use the draw() method to draw the
    // generated on the graphics context.
    public class Mandelbrot {
        // Holds the generated image
        Image image;
    
        // 16-color model
        ColorModel colorModel = generateColorModel();
    
        public Mandelbrot(int width, int height) {
            // Initialize with default location
            this(width, height, new Rectangle2D.Float(-2.0f, -1.2f, 3.2f, 2.4f));
        }
    
        public Mandelbrot(int width, int height, Rectangle2D.Float loc) {
            image = Toolkit.getDefaultToolkit().createImage(
                new MemoryImageSource(width, height,
                colorModel, generatePixels(width, height, loc), 0, width));
        }
    
        public void draw(Graphics g, int x, int y) {
            g.drawImage(image, x, y, null);
        }
    
        private byte[] generatePixels(int w, int h, Rectangle2D.Float loc) {
            float xmin = loc.x;
            float ymin = loc.y;
            float xmax = loc.x+loc.width;
            float ymax = loc.y+loc.height;
    
            byte[] pixels = new byte[w * h];
            int pIx = 0;
            float[] p = new float[w];
            float q = ymin;
            float dp = (xmax-xmin)/w;
            float dq = (ymax-ymin)/h;
    
            p[0] = xmin;
            for (int i=1; i<w; i++) {
                p[i] = p[i-1] + dp;
            }
    
            for (int r=0; r<h; r++) {
                for (int c=0; c<w; c++) {
                    int color = 1;
                    float x = 0.0f;
                    float y = 0.0f;
                    float xsqr = 0.0f;
                    float ysqr = 0.0f;
                    do {
                        xsqr = x*x;
                        ysqr = y*y;
                        y = 2*x*y + q;
                        x = xsqr - ysqr + p[c];
                        color++;
                    } while (color < 512 && xsqr + ysqr < 4);
                    pixels[pIx++] = (byte)(color % 16);
                }
                q += dq;
            }
            return pixels;
        }
    
        private static ColorModel generateColorModel() {
            // Generate 16-color model
            byte[] r = new byte[16];
            byte[] g = new byte[16];
            byte[] b = new byte[16];
    
            r[0] = 0; g[0] = 0; b[0] = 0;
            r[1] = 0; g[1] = 0; b[1] = (byte)192;
            r[2] = 0; g[2] = 0; b[2] = (byte)255;
            r[3] = 0; g[3] = (byte)192; b[3] = 0;
            r[4] = 0; g[4] = (byte)255; b[4] = 0;
            r[5] = 0; g[5] = (byte)192; b[5] = (byte)192;
            r[6] = 0; g[6] = (byte)255; b[6] = (byte)255;
            r[7] = (byte)192; g[7] = 0; b[7] = 0;
            r[8] = (byte)255; g[8] = 0; b[8] = 0;
            r[9] = (byte)192; g[9] = 0; b[9] = (byte)192;
            r[10] = (byte)255; g[10] = 0; b[10] = (byte)255;
            r[11] = (byte)192; g[11] = (byte)192; b[11] = 0;
            r[12] = (byte)255; g[12] = (byte)255; b[12] = 0;
            r[13] = (byte)80; g[13] = (byte)80; b[13] = (byte)80;
            r[14] = (byte)192; g[14] = (byte)192; b[14] = (byte)192;
            r[15] = (byte)255; g[15] = (byte)255; b[15] = (byte)255;
    
            return new IndexColorModel(4, 16, r, g, b);
        }
    }

Here‘s some code that uses the Mandelbrot class:

    class RunMandelbrot {
        static public void main(String[] args) {
            new RunMandelbrot();
        }
        RunMandelbrot() {
            Frame frame = new Frame("Mandelbrot Set");
            frame.add(new MyCanvas());
            frame.setSize(300, 200);
            frame.setVisible(true);
        }
    
        class MyCanvas extends Canvas {
            Mandelbrot mandelbrot;
    
            MyCanvas() {
                // Add a listener for resize events
                addComponentListener(new ComponentAdapter() {
                    // This method is called when the component‘s size changes
                    public void componentResized(ComponentEvent evt) {
                        Component c = (Component)evt.getSource();
    
                        // Get new size
                        Dimension newSize = c.getSize();
    
                        // Regenerate the image
                        mandelbrot = new Mandelbrot(newSize.width, newSize.height);
                        c.repaint();
                    }
                });
            }
    
            public void paint(Graphics g) {
                if (mandelbrot != null) {
                    mandelbrot.draw(g, 0, 0);
                }
            }
        }
    }

 

Related Examples

以上是关于e660. 用一组像素创建图像的主要内容,如果未能解决你的问题,请参考以下文章

自定义对话框片段

为啥使用 k-means(来自 Scipy)聚类到两个片段的图像会显示两个以上不同的像素值?

opencv中,如何求图像的某区域均值和方差?

如何标记从卷积神经网络的分割算法生成的图像片段?

欧几里得距离两个像素,每个像素属于不同的图像

图像的矩 图像的轮廓面积和长度