プログラムdeタマゴ

nodamushiの著作物は、文章、画像、プログラムにかかわらず全てUnlicenseです

BufferedImageのデータ配列をまるごと変更したかった

メモリ節約等の為にBufferedImageが使ってる配列を自分で用意したいんだけど、WritableRasterとやらが意味わかんない。
 
 
ブチギレした私はリフレクションしてむりやり変更してやった。

 

public class Test extends JComponent{
    
    BufferedImage bf;
    public static void main(String args) {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(3);
        f.add(new Test());
        f.pack();
        f.setVisible(true);
    }
    
    public Test() {
        setPreferredSize(new Dimension(100,100));
        int
pixeldata = new int[100*100];
        for(int r,g,b,x,i=0,y=0;y<100;y++){
            r=y;
            g=y*2;
            for(x = 0;x<100;x++,i++){
                b = x*2;
                pixeldata[i] = 255 << 24 | r << 16|g << 8|b;
            }
        }
        bf = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
        DataBufferInt buffer = (DataBufferInt)bf.getRaster().getDataBuffer();

        
        try {
            Field f = DataBufferInt.class.getDeclaredField("data");
            f.setAccessible(true);
            f.set(buffer, null);
            f = DataBufferInt.class.getDeclaredField("bankdata");
            f.setAccessible(true);
            f.set(buffer,new int{pixeldata});
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(0);
        }
        
    }
    
    @Override
    public void paintComponent(Graphics g) {
        g.drawImage(bf, 0, 0, this);
    }

}
期待した結果
 
 
実際の残念な結果

 
たぶん、どこかで配列が保存されてるのかなぁ〜と思って、配列を変更する前に配列を取り出しておいて、書き換えてから前の配列に変更を加えたら期待した結果になった。やっぱりどっかでコピーがとられてるみたい。
 
これ成立させたかったら思った以上に深くソース調べないといけないね。でも、面倒くさいからパス
 
ま、Image関連で無茶はするなって事なのかねぇ。