Javaには VRAMの概念がありません
それだとプログラミングができない人がいます(私とか)
画面にドットを打つ方法を説明します
先頭から8ビットで、ARGBです
Aは 0側が透明ですで 8ビット深度です
以上(ぉ
これで分からない人は、そもそもこのページ読む必要無いので飛ばして下さい('-'*)
Javaでは、Image形式にしなければ画面表示が行えませんので、createImageします
色の順番とかわかり易いようにして書いておきます
public void paint(Graphics g){ int w= 640; int h= 480; int pix[]= new int[w * h]; int index = 0; int red,green,blue; for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { red= 0; green= 0; blue= 255; pix[index++] = (255 << 24) | (red << 16) | (green << 8) | blue; } } Image img= createImage(new MemoryImageSource(w, h, pix, 0, w)); MediaTracker tracker= new MediaTracker(this); tracker.addImage(img, 0); try{ tracker.waitForAll(); }catch(Exception e){} g.drawImage(img, 0, 0, this); }
αをシフトで書きましたが、int型は signedなので、右シフトする場合は十分注意して下さい
Javaには右大なり3つの演算子があるようです
C言語だと (unsigned char)255 >> 1のところを、Javaは 255 >>> 1; ではないかと思われます
(255 & 0x7f) >> 1 とかがいいのかな?
画像を読み込んで、RGBそれぞれ半分の明るさにしてみます
サンプルですので、これ自体に深い意味はありません
createImageの反対は PixelGrabberです
public void paint(Graphics g){ //イメージ読み込み Image img= Toolkit.getDefaultToolkit().getImage(this.getClass().getResource("xxx.jpg")); MediaTracker tracker= new MediaTracker(this); tracker.addImage(img, 0); try{ tracker.waitForAll(); }catch(Exception e){} int w= img.getWidth(null); int h= img.getHeight(null);; //ピクセルデータに戻す int[] pix= new int[w * h]; PixelGrabber pg= new PixelGrabber(img, 0, 0, w, h, pix, 0, w); try{ pg.grabPixels(); }catch(Exception e){} //明るさを半減 int red,green,blue; for(int index=0; index < pix.length; index++){ //RGB値取得 red= (pix[index] & 0xff0000) >> 16; green= (pix[index] & 0xff00) >> 8; blue= pix[index] & 0xff; //半分にする(端数切捨て) red= red >> 1; green= green >> 1; blue= blue >> 1; //元のintに戻す pix[index] = (255 << 24) | (red << 16) | (green << 8) | blue; } //イメージに戻す Image img2= createImage(new MemoryImageSource(w, h, pix, 0, w)); tracker= new MediaTracker(this); tracker.addImage(img2, 0); try{ tracker.waitForAll(); }catch(Exception e){} //描画 g.drawImage(img2, 0, 0, this); }
やってみればわかる事ですが、paintに直接こんな事を書くと異様に遅いです
なぜなら、何もしていなくても paintメソッドは毎秒数十回来ているからです
きちんと、自分で FPS管理して描画しましょう(そういう事する人しかこのページ読む意味無いわけですが)
高速化の為に、演算は intのまま行うのも手です
例えば、上の例だと
//明るさを半減 for(int index=0; index < pix.length; index++){ pix[index]= ((pix[index] & 0x00fefefe) >> 1) | 0xff000000; }
こんな感じにすると、変数も演算量も減りますよね?(そんな事は百も承知と言う人しかこのページ(以下略))
以上、全ての説明は BD-Jに限った話では無く、Javaの説明になっちゃっています(*'-')