Отрисовка изображения в java

Я пытаюсь поместить изображение в java JFrame, но я хочу изменить каждый пиксель, поэтому я хочу загрузить его попиксельно. Я застрял в части, где пиксели должны быть загружены на экран, но я не вижу никакого эффекта. Что я пропустил?

Я почти уверен, что это что-то маленькое, но почему-то я его не вижу.

Display.java

public class Display extends Canvas  implements Runnable{


public static int WIDTH=1280;
public static int HEIGHT=800;
public static final String TITLE = "rainbow effect";

private Thread thread;
private boolean running = false;
private Screen screen;
private BufferedImage img;
private int pixels[];

public Display(){
    Dimension size = new Dimension(WIDTH,HEIGHT);
    setPreferredSize(size);
    setMinimumSize(size);
    setMaximumSize(size);
    screen = new Screen(WIDTH, HEIGHT);
    img = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
    pixels = ((DataBufferInt)img.getRaster().getDataBuffer()).getData();

}

@Override
public void run() {
    while(running){
        requestFocus();
        render();

    }   
}

public synchronized void start(){
    if(running) 
        return;
    running = true;
    thread = new Thread(this);
    thread.start();

    //System.out.println("working...");
}


public synchronized void stop(){
    if(!running)
        return;
    running = false;
    try{
        thread.join();
    } catch(Exception e){
        e.printStackTrace();
        System.exit(0);
    }
}   


private void render(){
    BufferStrategy bs = this.getBufferStrategy();
    if(bs == null)
    {
        createBufferStrategy(3);
        return;
    }
    screen.render();
    for(int i=0; i<WIDTH*HEIGHT; i++)
    {
        pixels[i] = screen.pixels[i];
    }
//-------------------EDIT------------//
    Graphics g = bs.getDrawGraphics();
    g.drawImage(img, 0, 0, WIDTH, HEIGHT, null);
    g.dispose();
//--------------END OF EDIT-----------//
    bs.show();
}

    public static void main(String[] args){
        //BufferedImage cursor = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB);
        //Cursor blank = Toolkit.getDefaultToolkit().createCustomCursor(cursor, new Point(0,0), "blank");
        Display game = new Display();
        JFrame frame = new JFrame();
        frame.add(game);

        frame.setTitle(TITLE);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.pack();
        //frame.getContentPane().setCursor(blank);
        frame.setVisible(true);

        System.out.println("running ...");

        game.start();


    }
}

Скрим.java

public class Screen extends Render {

private Render test;

public Screen(int width, int height) {
    super(width, height);
    Random random = new Random();
    //test = new Render(width, height);
    test = new Render(width, height);
    for(int i=0; i<width*height; i++){
        test.pixels[i] = Image.img.pixels[i];
        }
}

public void render(){
    for(int i =0 ; i <width*height;i++){
        pixels[i]=0;
    }

    test.draw(test, 0, 0);
}

}

Рендер.java

public class Render {
public final int width, height;
public final int [] pixels;

public Render(int width, int height){
    this.width = width;
    this.height = height;
    pixels = new int[width * height];
}

public void draw(Render render, int xOffset, int yOffset){
    for(int y=0; y<render.height; y++){
        int yPix = y+yOffset;
        if(yPix<0 || yPix >=height){
            continue;
        }
        for(int x=0; x < render.width; x++){
            int xPix = x+xOffset;
            if(xPix < 0 ||yPix >=width){
                continue;
            }
            int alpha = render.pixels[x+y*render.width];
            if(alpha >0)
            {
                pixels[xPix+yPix*width]=alpha;
            }
        }
    }
}

}

Изображение.java

 public class Image {
 public static Render img = loadBitmap("/images/sample2.jpg");

public static Render loadBitmap(String fileName){
    try{
        BufferedImage image = ImageIO.read(Image.class.getResource(fileName));
        int width = image.getWidth();
        int height = image.getHeight();
        Render result = new Render(width, height);
        image.getRGB(0, 0, width, height, result.pixels, 0 ,width);
        return result;
    }catch(Exception e){
        System.out.println("crash");
        throw new RuntimeException(e);

    }
}
}

person Akka Jaworek    schedule 16.04.2016    source источник
comment
Вы не сохраняете значение, возвращенное из image.getRGB, поэтому объект Render, который вы возвращаете из loadBitmap, не содержит никакой информации о пикселях.   -  person Cethy    schedule 16.04.2016
comment
Где вы на самом деле выполняете какие-либо операции по покраске?   -  person MadProgrammer    schedule 16.04.2016
comment
@Cethy, массив ''result.pixels'' не равен нулю, поэтому предполагается, что все RGB должны быть записаны в этот массив.   -  person Akka Jaworek    schedule 16.04.2016
comment
Ok. Но не быть нулевым и действительно содержать релевантные данные — это две разные вещи. Вы пробовали перебирать массив?   -  person Cethy    schedule 16.04.2016
comment
@Cethy, да, у меня полно данных.   -  person Akka Jaworek    schedule 16.04.2016
comment
Когда я запускаю ваш код (конечно, с другим изображением), все пиксели в массиве имеют значение 0, поскольку вы, по сути, просто инициализируете массив 0 в Render. Разве не должна храниться информация о пикселях из изображения?   -  person Cethy    schedule 16.04.2016
comment
@MadProgrammer я вызываю bs.show, чтобы изменить указатель отображения.   -  person Akka Jaworek    schedule 16.04.2016
comment
@AkkaJaworek Но ты ничего не рисуешь?! Для примера   -  person MadProgrammer    schedule 16.04.2016
comment
@MadProgrammer омг... как я мог это пропустить. Хорошо, исправил, но теперь все закрашивается черным.   -  person Akka Jaworek    schedule 16.04.2016
comment
@AkkaJaworek Вам нужно обновить код, чтобы показать, как и что вы рисуете   -  person MadProgrammer    schedule 16.04.2016
comment
@MadProgrammer делал обновление в эту секунду   -  person Akka Jaworek    schedule 16.04.2016
comment
@AkkaJaworek Насколько я могу судить, img пусто   -  person MadProgrammer    schedule 16.04.2016
comment
хорошо, я понял свою ошибку, я сделал весь экран черным (но это хорошо), теперь мне нужно сделать изображение на этом черном фоне.   -  person Akka Jaworek    schedule 16.04.2016
comment
@MadProgrammer еще один вопрос, в Display.jav' im assaiginig pixels = ((DataBufferInt)img.getRaster().getDataBuffer()).getData();, так что, если я правильно понимаю, pixels в основном являются указателем на массив данных img, это правильно? поэтому, если я что-то изменю в pixels, это также должно измениться в img?   -  person Akka Jaworek    schedule 16.04.2016
comment
@AkkaJaworek Я не уверен, является ли это копией или указателем на фактические данные изображения, мне нужно прочитать документы, чтобы быть уверенным, лично я просто использую Graphics2D для управления контекстом изображения/графики   -  person MadProgrammer    schedule 17.04.2016