Wyświetlenie obrazu w GraphicView
-
Witam!
Buduje aplikację która ma porównywać obrazy i pracować na pikselach załadowanych obrazów (porównywanie dwóch obrazów, wykrywanie krawędzi itp itd). Na głównym formie ma wyświtlać załadowany wcześniej obrazek. Do tego celu używam widgetu GraphicView i chce załadować obraz do niego za pomocą przycisku jednak coś jest nie tak i dlatego zdecydowałem się tu napisać. Może podpowiecie mi co robie źle lub poradzicie jak to zrobić. Oto mój kod który jest pod przyciskiem na formie:
@ QString nazwaZdjecia1 = QFileDialog::getOpenFileName(this, tr("Otwórz plik"), "C:/", tr("Obrazy (*.jpg .png .bmp)"));
QFile ladowanyPlik(nazwaZdjecia1);
QString sciezka = ladowanyPlik.fileName();
ui->lineEditZdjecie1->setText(nazwaZdjecia1);
if(!sciezka.isEmpty()){
QImage obraz(sciezka);
if(obraz.isNull()){
QMessageBox::information(this,"","Wystąpił błąd podczas wyświetlania obrazu! Spróbuj ponownie.");
return;
}
QGraphicsScene scena = new QGraphicsScene();
QGraphicsPixmapItem item = new QGraphicsPixmapItem(QPixmap::fromImage(obraz));
scena->addItem(item);
ui->graphicsViewZdjecie1->setScene(&scena);
ui->graphicsViewZdjecie1->show();
}
QByteArray zawartoscPliku(ladowanyPlik.readAll());@Jestem jeszcze zielony jesli chodzi o poruszanie się w Qt (to jest mój pierwszy projekt w tym środowisku) dlatego każda pomoc będzie nioceniona. Kompilator zgłasza błąd z QGraphicPixmap że nie posiada on konstruktora (biblioteka załączona na początku przez #include) oraz że nie można go konwertować do QGraphicItem. Inna sprawa że muszę jakoś wydobyć piksele z załadowanego obrazu aby potem na nich operować i nie wiem czy samo załadowanie danych obrazu do tablicy bajtów wystarczy czy trzeba to jakoś inaczej wykonać. JEśli tak jest, to jak to zrobić?
-
No to może tak. Co zrobić i jak aby poprawnie wyświetlać obraz w GraphicView, który jest ładowany z przycisku poprzez obiekt QFile. Czy powyższy kod powinien działać czy może podejście ze scenami i itemami jest błędne?
Bardzo was prosze o pomoc bo póki co nie znalazłem niestety rozwiązania tego problemu :/
-
Twój kod u mnie się skompilował gdy na poczatku pliku dodałem:
@#include <QGraphicsPixmapItem>
@ -
Troche udało mi si ę już pozmieniać ten kod i zdobyć wiedze na temat obiektu item, który niekoniecznie musi być używany (a już napewno nie jako wskaźnik) jeśli mamy do czynienia z najnowszym Qt w wersji 5.x dlatego iż w tej wersji pamięć przez niektóre funkcje jest inaczej adresowana. Też mnie to na początku zdziwiło no ale tak jest. W tej chwili mój kod wygląda tak:
@ QGraphicsScene *scena = new QGraphicsScene(ui->graphicsViewZdjecie1);
QPixmap mapaPikseli(nazwaZdjecia1);
scena->addPixmap(mapaPikseli);
ui->graphicsViewZdjecie1->setScene(scena);
ui->graphicsViewZdjecie1->fitInView(scena->itemsBoundingRect(),Qt::KeepAspectRatio);
ui->graphicsViewZdjecie1->show();@Z tego co udało mi się ustalić obiekt item, który wcześniej używałem aby działać na pixmapie jest zgodny ale wyłącznie w wersjach wcześniejszych niż Qt 5.x To tak dla potomności... :)
Czy ktoś się orientuje czy i ewentualnie w jaki sposób można wyciągać i modyfikować piksel po pikselu z tej pixmapy czy trzeba to wrzucać do tablicy bajtowej i wyciągać z tego dopiero pojedyncze piksele oraz czy jest jakiś sposób na wstępne obcinanie i skalowanie obrazu np. aby usunąc nadmiar jakiegoś koloru w obrazie?