画像のビットパターンに何らかの変更を加えて再描画する Java
Applet を作成中なのですが、配列にビットパターンを格納して
別の配列にコピーして再描画するという方法を使っています。
これが、何故か画像の一部だけしか表示しない。しかも、同じアプレ
ットをブラウザの「再読込」でリロードすると今度は問題無く表示
される。この理由が、私には解らない。是非原因と思しき部分を教えて
下さい。
[gis3.html]
<html>
<meta http-equiv=Content-Type Content=text/html; charset=x-sjis>
<body>
<applet code=gis3.class width=1024 height=768>
</applet>
</body>
</html>
[gis3.java]
import java.applet.*;
import java.applet.Applet;
import java.awt.*;
import java.awt.image.*;
import java.awt.image.MemoryImageSource;
import java.util.*;
import java.net.*;
public class gis3 extends Applet implements Runnable
{
String gazou;
Dimension size;
MediaTracker tracker;
Image jpeg, img, dst;
Thread thread;
Graphics Scr0, Scr1;
PixelGrabber pixel, grab;
MemoryImageSource mis;
int dot[], buf[];
public void init(){
gazou = pasta.jpg;
try {
URL imgurl = new URL(gazou);
jpeg = getImage(imgurl);
}
catch (MalformedURLException e){
jpeg = getImage(getDocumentBase(), gazou);
}
size = getImageSize(jpeg);
tracker = new MediaTracker(this);
tracker.addImage(this.jpeg, 0);
dot = new int[size.width * size.height];
mis = new MemoryImageSource(
size.width, size.height,
dot, 0, size.width);
img = createImage(mis);
dst = createImage(size.width, size.height);
Scr0 = dst.getGraphics();
Scr1 = getGraphics();
}
private Dimension getImageSize(Image image) {
int w = 0;
int h = 0;
try {
do {
w = image.getWidth(null);
h = image.getHeight(null);
Thread.currentThread().sleep(100);
} while (w < 0 || h < 0);
} catch (InterruptedException e) {
e.printStackTrace();
}
return new Dimension(w, h);
}
public void start(){
if(thread == null){
thread = new Thread(this);
thread.start();
}
}
public void paint(Graphics g){
int stat = pixel.getStatus();
if ((stat & ABORT) != 0) {
g.drawString(Image grab was aborted, 10, 100);
} else if ((stat & ALLBITS) != 0) {
g.drawString(Image grab is complete, 10, 100);
} else if ((stat & FRAMEBITS) != 0) {
g.drawString(Frame grab is complete, 10, 100);
} else if ((stat & SOMEBITS) != 0) {
g.drawString(Image grab is under way, 10, 100);
}
if ((stat & (WIDTH|ALLBITS|FRAMEBITS)) != 0) {
}
if(Scr0 != null){
try {
Scr1.drawImage(dst, 0, 0, this);
g.drawImage(img, 0, 0, this);
}
finally {
Scr0.dispose();
}
}
flush();
}
public synchronized void run(){
try {
tracker.waitForID(0);
}
catch(InterruptedException e){
e.printStackTrace();
}
pixel = new PixelGrabber(jpeg, 0, 0, size.width, size.height, dot, 0,
size.width);
try {
pixel.grabPixels();
}
catch (InterruptedException e){
e.printStackTrace();
}
while(true){
dupimage();
mis.newPixels();
}
}
private void dupimage(){
buf = new int[size.width * size.height / 8];
System.arraycopy(dot, 0, buf, 0, size.width * size.height / 8);
for(int i=0; i<size.width * size.height / 8; i++){
dot[i] = buf[i];
}
}
}