QImage::setPixel: Index ... out of range

0

Cześć!

Przy wywoływaniu

void codec::on_MAP_clicked()
{  
    for(int y=1; y<height-1; y++)
    {
        for (int x=1; x<width-1; x++)
        {
            picture_copy.setPixel(x, y, call_MAP(x, y));
        }
    }
 }

otrzymuję szereg komunikatów:
QImage::setPixel: Index ... out of range

gdzie metoda call_MAP(x,y) zwraca zmienną typu QRgb o wpółrzędnych (x, y) a picture i picture_copy to QImage, do których ładowany jest obraz .bmp.

Komunikaty wskazywałyby na przekroczony zakres ale nie bardzo wiem czym jest to spowodowane (wydawało mi się, że zabezpieczenie na wypadek przekroczenia zakresu zapewniłam przy pętlach for ale jak widać to było błędne założenie). Czy możliwe, że problem leży po stronie kompilatora?
Będę wdzięczna za podpowiedzi jak problem można rozwiązać lub na co zwrócić uwagę.

Poniżej zamieszczę też kod metody call_MAP(x, y):

QRgb codec::call_MAP(int w, int h)
{
    int r, g, b;
    QRgb pixel_val, pixel_val_1, pixel_val_2, pixel_val_3;
//======================P(x)
    pixel_val=picture.pixel(w,h);
    pixel_val_1=picture.pixel(w-1, h);
    pixel_val_2=picture.pixel(w,h-1);
    pixel_val_3=picture.pixel(w-1,h-1);

//=======================================================================R
    if (qMax(qRed(pixel_val_1), qRed(pixel_val_2))<=qRed(pixel_val_3))
    {
        r=qMin(qRed(pixel_val_1), qRed(pixel_val_2));
    }

    else if (qMin(qRed(pixel_val_1), qRed(pixel_val_2))>=qRed(pixel_val_3))
    {
        r=qMax(qRed(pixel_val_1), qRed(pixel_val_2));
    }

    else
    {
        r=qRed(pixel_val_1)+qRed(pixel_val_2)-qRed(pixel_val_3);
    }
//=======================================================================G
    if (qMax(qGreen(pixel_val_1), qGreen(pixel_val_2))<=qGreen(pixel_val_3))
    {
        g=qMin(qGreen(pixel_val_1), qGreen(pixel_val_2));
    }

    else if (qMin(qGreen(pixel_val_1), qGreen(pixel_val_2))>=qGreen(pixel_val_3))
    {
        g=qMax(qGreen(pixel_val_1), qGreen(pixel_val_2));
    }

    else
    {
        g=qGreen(pixel_val_1)+qGreen(pixel_val_2)-qGreen(pixel_val_3);
    }


//=======================================================================B

    if (qMax(qBlue(pixel_val_1), qBlue(pixel_val_2))<=qBlue(pixel_val_3))
    {
        b=qMin(qBlue(pixel_val_1), qBlue(pixel_val_2));
    }

    else if (qMin(qBlue(pixel_val_1), qBlue(pixel_val_2))>=qBlue(pixel_val_3))
    {
        b=qMax(qBlue(pixel_val_1), qBlue(pixel_val_2));
    }

    else
    {
        b=qBlue(pixel_val_1)+qBlue(pixel_val_2)-qBlue(pixel_val_3);
    }

     pixel_val=qRgb(r, g, b);
     return pixel_val;
}
0

Sprawdz ilosc pixeli w obrazku (szer. i wys.) i potem sprawdz czy na pewno nigdzie tej wartosci nie przekroczyles. Kompilator nie ma tu nic do rzeczy. bo zgaduje ze bledy wywala po odpaleniu programu

0

Ilość pikseli nie jest przekraczana, dla obrazków 25 na 25 współrzędne zmieniają się w zakresie od (1,1) do (23,23).

0

A sprawdź jeszcze czy r, g i b nie przekraczają 255 i pixel_val ma odpowiednią wart.

0

Dla przetestowanego przypadku (gdzie komunikaty o błędzie występowały):
-maksymalna wartość dla r,g, b to 255 czyli ok,
-QString::number(pixel_val) zwraca największą wartość jako 4294966256 (tu niestety nie wiem czego się mam spodziewać).

0

To raczej na pewno nie powinna byc tak wysoka wartosc.

0

Wartość pixel_val przypisuję za pomocą funkcji qRgb

pixel_val=qRgb(r, g, b); 

Wydaje mi się, że jeśli r, g, b są poprawne to i wartość pixel_val powinna być ok, poprawcie mnie proszę jeśli się mylę.

0

A jesteś pewien że obraz w ogóle się wczytał? Upewnij się najpierw czy obraz załadował się do tej zmiennej. Miałem kiedyś podobny problem i okazało się po prostu, że operuję na pustej zmiennej.

0

Tak, obraz jest wczytany, przed wywołaniem metod wołam

    if (picture_name.isNull())
    {
        ui->results->setText("Picture not inserted");
        return;
    }

Jeżeli picture jest nullem metoda MAP wcale nie jest wykonywana.

1
void codec::on_MAP_clicked() {
    picture_copy = QImage(width, height, QImage::Format_RGB888);
    for(int y=1; y<height-1; y++) { // czy tu nie powinno być y=0?
        for (int x=1; x<width-1; x++) { // czy tu nie powinno być x=0?
            picture_copy.setPixel(x, y, call_MAP(x, y));
        }
    }
}
0

Super, działa! MarekR22 dzięki wielkie :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1