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

QImage::setPixel: Index ... out of range
SL
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 11 lat
0

Cześć!

Przy wywoływaniu

Kopiuj
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):

Kopiuj
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;
}
MateuszS
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 5 lat
  • Postów:311
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

SL
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 11 lat
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).

MateuszS
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 5 lat
  • Postów:311
0

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

edytowany 2x, ostatnio: MateuszS
SL
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 11 lat
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ć).

edytowany 1x, ostatnio: sluuu
MateuszS
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 5 lat
  • Postów:311
0

To raczej na pewno nie powinna byc tak wysoka wartosc.

edytowany 1x, ostatnio: MateuszS
SL
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 11 lat
0

Wartość pixel_val przypisuję za pomocą funkcji qRgb

Kopiuj
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.

SL
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 11 lat
0

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

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

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

MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:16 minut
1
Kopiuj
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));
        }
    }
}

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
SL
Nie powinno być 0 ponieważ callMAP wylicza wartość piksela (x, y) korzystając z "wcześniejszych" pikseli np: (x-1, y-1)
SL
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 11 lat
0

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.