3

複数の方法で画像を操作する必要があるプロジェクトがあります。私はピクセル化にこだわっています。

ピクセレーションの場合、10x10 のピクセル セットを取得し、RGB カラーを個別に平均化した 1 つのセルを返す必要があります。現在、ランナープログラムで取得できるのは赤い画像だけです。助けてくれてありがとう。

public static Photograph pixelated(Photograph photo) {
        int red = 0;
        int green = 0;
        int blue = 0;
        int interval = 10;
        Photograph p = null;
        p = new Photograph(photo.getWidth(),photo.getHeight());
        for (int row=0; row<photo.getHeight(); row +=interval) {
            for (int col=0; col<photo.getWidth(); col +=interval) {

                for (int row2=row; row2<row+10; row2++) {
                    for (int col2=col; col2<col+10; col2++) {
                    red = red + photo.getPixel(col, row).getRed();
                    green = green + photo.getPixel(col, row).getGreen();
                    blue = blue + photo.getPixel(col, row).getBlue();   
                    }
                }
            red = red / interval;
            green = green / interval;
            blue = blue / interval;

            Pixel rgb = new Pixel(red,green,blue);
            for (int row3=0; row<interval; row++) {
                for (int col3=0; col<interval; col++) {
                    p.setPixel(col3, row3, rgb);
        }}}}
        return p;
        } 
4

1 に答える 1

0

そこにはいくつかのバグがあります。各ブロック間で赤、緑、青の値をリセットしていません。必要なスコープでのみ変数を使用できるようにすることをお勧めします。

間隔は断続的に使用されました。

また、平均を正しく取得していないことを指摘したように、丸めの問題を考慮することもできます。このコードは切り捨てられます。

注意すべきことの 1 つは、赤、緑、青が int である場合もあれば float である場合もあるということです。これらを混同すると問題が発生します。

public static Photograph pixelated(Photograph photo) {
    int interval = 10;
    Photograph p = null;
    p = new Photograph(photo.getWidth(),photo.getHeight());
    for (int row=0; row<photo.getHeight(); row +=interval) {
        for (int col=0; col<photo.getWidth(); col +=interval) {
            // declare and reset variables here
            int red = 0;
            int green = 0;
            int blue = 0;

            for (int row2=row; row2<row+interval; row2++) {
                for (int col2=col; col2<col+interval; col2++) {
                    // i assume these functiosn return an int 0 <= x < 256 ?
                    red = red + photo.getPixel(col, row).getRed();
                    green = green + photo.getPixel(col, row).getGreen();
                    blue = blue + photo.getPixel(col, row).getBlue();   
                }
            }
            // you have a square not a line
            red = red / (interval * interval);
            green = green / (interval * interval);
            blue = blue / (interval * interval);

            // i assume this constructor takes ints 0 <= x < 256 ?
            Pixel rgb = new Pixel(red,green,blue);
            // interval needs to be used here
            for (int row3=row; row3< row+interval; row3++) {
                for (int col3=col; col3<col+interval; col3++) {
                    p.setPixel(col3, row3, rgb);
                }
            }
        }
    }
    return p;
} 
于 2013-03-14T04:41:16.977 に答える