Java链表:如何在图片中添加像素



我有一个关于在LinkedList中添加"Pixel"的问题。

有一个用于黑白图片的类(类名为"Bild")。当你创建一个图像的对象时,你必须说明图像的高度和宽度是多少。宽度u还表示图片对象中的像素数组有多大。所以图片的宽度和数组的长度一样长!

在数组的每个元素中应该是图片的列作为"像素"的链表。但是在链表中只有黑色像素是安全的!每个"像素"都有一个int表示它在图片中的位置。白色像素不安全!

完成方法:

  • public Pixel pixelAt(int zeile, int spalte)这个方法在"图片"的行/列中返回一个"像素"。如果没有黑色的"像素",则返回null。

  • public void printBild()

  • 为黑色像素打印"*",为白色像素打印"-"。

未完成方法:

  • public void pixelOn(int zeile, int spalte)

这个方法应该检查行/列中是否有黑色像素。这里我可以使用pixelAt()方法。一个白色像素应该变成一个黑色像素,这样就有一个像素被添加到链表中。如果像素已经是黑色,什么也不会发生。

再次调用printBild()后,白色像素"_"仍然是白色的,而不是黑色的"*"。

public class Pixel { 
private int zeile; 
private Pixel next; 
public Pixel ( int zeile, Pixel p ) {
    this.zeile = zeile;
    this.next = p;
}
public int getZeile() {
    return zeile;
}
public Pixel getNext() {
    return next;
}
// Setze Verweis auf nächsten schwarzen Pixel 
public void setNext( Pixel p) {
    next = p;
}
}

public class Bild {
private Pixel [] data;
private int hoehe, breite;  
public Bild (int hoehe, int breite) {
    this.data = new Pixel [breite];
    this.hoehe = hoehe;
    this.breite = breite;
}
public void setData(Pixel [] temp) {
        this.data = temp;   
}
public Pixel pixelAt(int zeile, int spalte) { 
    Pixel iterator = data[spalte];
    if(iterator.getZeile() == zeile) {
        return iterator;
    }
    else {
        while (iterator.getNext() != null) {
            iterator = iterator.getNext();
            if(iterator.getZeile() == zeile) {
                return iterator;
            }
        }
    }
    return null;
}

public void printBild() { 
    String leer = "";
    String [] hi = new String [hoehe];
    for (int k = 0; k < hoehe; k++) {
        hi[k] = leer;
    }
    for (int i = 0; i < data.length; i++) {
        Pixel iterator = data[i];
        for (int j = 0; j < hoehe ; j++) {
            if (iterator == null) {
                hi[j] += " - ";
            }
            else {
            if (iterator.getZeile() == j) {
                hi[j] += " * ";
                iterator = iterator.getNext();
            }
            else {
                hi[j] += " - ";
            }
        }
        }
    }
    for (int q = 0; q < hi.length; q++) {
        System.out.println(hi[q]);
    }

}
public void pixelOn(int zeile, int spalte) {

    if (pixelAt(zeile, spalte) == null) {
        Pixel it = data[spalte];
        for (int i = 1; i < zeile; i++) {   
            it = it.getNext();
        }
        Pixel tmp = it.getNext();
        Pixel neu = new Pixel(zeile, null);
        it.setNext(neu);
        neu.setNext(tmp);
    }   
}
}


public class TestBild {
public static void main(String[] args) {

Pixel a1 = new Pixel(2, null);

Pixel b1 = new Pixel(0, null);
Pixel b2 = new Pixel(1,null);
b1.setNext(b2);
Pixel b3 = new Pixel (3, null);
b2.setNext(b3);

Pixel c1 = new Pixel(1, null);
Pixel c2 = new Pixel(2,null);
c1.setNext(c2);

Pixel [] temp = new Pixel [3];
temp[0] = a1;
temp[1] = b1;
temp[2] = c1;

Bild BW = new Bild(4,3);
BW.setData(temp);

BW.printBild();
BW.pixelOn(2, 0);
System.out.println();
BW.printBild();

}

}

谢谢!

首先,您的pixelOn比您编写的更棘手。它应该是这样的:

public void pixelOn(int zeile, int spalte) {
    if (pixelAt(zeile, spalte) == null) {
        Pixel neu = new Pixel(zeile, null);
        Pixel it = data[spalte];
        if(it!=null){
            if(it.getZeile()<zeile){
                Pixel tmp=it.getNext();
                while(tmp!=null && tmp.getZeile()<zeile){
                    it = tmp;
                    tmp = it.getNext();
                }
                it.setNext(neu);
                neu.setNext(tmp);
            }else{
                neu.setNext(it);
                data[spalte] = neu;
            }
        }else{
            //there is nothing in the column for now add it
            data[spalte] = neu;
        }
    }
}

第二,您的测试不是在白色位置插入。(2,0)是第2行第0列。

相关内容

  • 没有找到相关文章

最新更新