[C++]Skalowanie obrazka o podane wspolrzedne

0

Chcialem zeskalowac sobie obrazek, tzn powiekszyc o podane wspolrzedne. Nie moge wkleic calego, dokladnego kodu, jednak ponizszy kawaleczek jest tym, co staram sie zrobic (to taki jakby pseudokod). Niestety, to mi nie "dziala" - program sie wywala, pisze, ze przestal dzialac. Gdzie jest blad, co robie zle? Dodam, ze musze uzyc metody najblizszego sasiada.

// we - obrazek wejsciowy
// wy - obrazek wyjsciowy
// wspX - o ile zwiekszyc x
// wspY - o ile zwiekszyc y

    int w1 = we.width();
    int h1 = we.height();
    int w2 = wy.width() * wspX;
    int h2 = wy.height() * wspY;

    int x1,y1;

    double ratioX = w1/w2;
    double ratioY = h1/h2;

    for(double y=0; y<h2; y++)
    {
     for(double x=0; x<w2; x++)
     {
      x1 = x*ratioX;
      y1 = y*ratioY;
      obrazekWy[x][y] = obrazekWe[x1][y1];
     }
    }
0

Nie moge sobie poradzic z tym ... Wklejam pelny kod, moze ktos bedzie w stanie pocmoc:

#include <QWidget>
#include <QPainter>
#include <QPaintEvent>
#include <QApplication>

class rysowanie : public QWidget
{

public:
        void paintEvent(QPaintEvent*);
public:
    rysowanie(QWidget* parent=0);
    void skaluj(QImage &we, QImage &wy, double sx, double sy);

};

void rysowanie::skaluj(QImage &we, QImage &wy, double sx, double sy){

    we = QImage(":/images/obrazek");

    int w1 = we.width();
    int h1 = we.height();

    wy.setDotsPerMeterX(wy.width() * sx);
    wy.setDotsPerMeterY(wy.height() * sy);

    int w2 = wy.dotsPerMeterX();
    int h2 = wy.dotsPerMeterY();

    int x1,y1;

    double ratioX = w1/w2;
    double ratioY = h1/h2;

    for(int y=0; y< h2; y++)
    {
     for(int x=0; x<w2; x++)
     {
      x1 = x * ratioX;
      y1 = y * ratioY;
      if(x1 >= 0 && x1 < we.width() && y1 >= 0 && y1 < we.height())
          wy.setPixel(QPoint(x,y),we.pixel(x1,y1));
     }
    }
}

void rysowanie::paintEvent(QPaintEvent* e)
{

    QImage  a = QImage(500,500,QImage::Format_RGB32);
    QImage  b = QImage(500,500,QImage::Format_RGB32);

    QPainter paint(this);
    skaluj(a,b,2,2);
    paint.drawImage(0,0,b);
    this->setFixedSize(500,500);
}

rysowanie::rysowanie(QWidget* parent) : QWidget(parent){}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    rysowanie obrazek;
    obrazek.show();
    return a.exec();
}
0

Hm, teraz działa, rysuje powiekszony obszar pod nowy obrazek, ale jest on pusty, nie ma na nim obrazka .. jak to poprawic?

#include <QWidget>
#include <QPainter>
#include <QPaintEvent>
#include <QApplication>

class rysowanie : public QWidget
{

public:
        void paintEvent(QPaintEvent*);
public:
    rysowanie(QWidget* parent=0);
    void skaluj(QImage &we, QImage &wy, double sx, double sy);

};

void rysowanie::skaluj(QImage &we, QImage &wy, double sx, double sy){

    we = QImage(":/images/obrazek");

    int w1 = we.width();
    int h1 = we.height();

    int w2 = w1 * sx;
    int h2 = h1 * sy;

    double x1,y1;

    double ratioX = w1/w2;
    double ratioY = h1/h2;

    for(double y=0; y<h2; y++)
    {
     for(double x=0; x<w2; x++)
     {
      x1 = x * ratioX;
      y1 = y * ratioY;
      if(x1 >= 0 && x1 < we.width() && y1 >= 0 && y1 < we.height())
          wy.setPixel(QPoint(x,y),we.pixel(x1,y1));
     }
    }
}

void rysowanie::paintEvent(QPaintEvent* e)
{

    QImage  a = QImage(100,100,QImage::Format_RGB32);
    QImage  b = QImage(500,500,QImage::Format_RGB32);

    QPainter paint(this);
    skaluj(a,b,2,2);
    paint.drawImage(0,0,b);
    this->setFixedSize(500,500);
}

rysowanie::rysowanie(QWidget* parent) : QWidget(parent){}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    rysowanie obrazek;
    obrazek.show();
    return a.exec();
}
0

Pierwszy (nie wiem, czy jedyny) błąd widzę w tych linijkach:
double ratioX = w1/w2;
double ratioY = h1/h2;
Dzielisz liczbę typu int przez inną liczbę typu int, przez co wynik będzie zaokrąglony do liczby całkowitej. Przynajniej jeden z argument ów dzielenia musi być typu rzeczywistego (u ciebie najlepiej double).

0

Dzięki, jestes wielki ! :) Cały dzień się nad tym męczyłem, a Ty jeden mi pomogłeś :) Bardzo dziękuję ! ^^ Proszę uprzejmie o usunięcie tematu :) Pozdrawiam serdecznie !

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