困りました – プログラミング – Home

通知
すべてクリア

困りました


コブラ
 コブラ
(@コブラ)
ゲスト
結合: 21年前
投稿: 1
Topic starter  

画像のビットパターンに何らかの変更を加えて再描画する 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];
}
}
}

画像 pasta.jpg は
から取れます。


引用解決済
トピックタグ

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました