Russian Qt Forum
Сентябрь 21, 2024, 20:00 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено] Сохранение изображения в файл  (Прочитано 13773 раз)
PulSar.CE3194694
Гость
« : Август 22, 2010, 11:44 »

Добрый день! Пытаюсь сохранить изображение в файл на жесткий диск компьютера, но не получается. Читал справку, самоучитель и смотрел программу Screenshot, делал примерно также, но он не хочет сохранять изображение. Создаётся лишь сам файл размером в 4 байта и все. Вот код:
Код
C++ (Qt)
void MainWindow::Save()
{
   QPixmap GraphicImage; //Создаю переменную для изображения.
   GraphicImage.grabWindow(tabWidget->currentWidget()->winId(), 5, 30, width()-10, height()-85); //Делаю скриншот текущей вкладки на tabWidget'е.
   FileName = QFileDialog::getSaveFileName(this, QString::fromLocal8Bit("Сохранить график"), "", QString::fromLocal8Bit("Изображения (*.jpg)")); //Указываем название.
   QFile ImageFile(FileName); //Создаем объект файла.
   ImageFile.open(QIODevice::WriteOnly); //Открываем только для записи.
   QDataStream Stream(&ImageFile); //Создаем поток, записывающий в наш файл.
   Stream<<GraphicImage; //Записываем в поток наш скриншот.
   ImageFile.close(); //После записи закрываем файл.
}

Где здесь ошибка?))
« Последнее редактирование: Август 24, 2010, 15:47 от PulSar.CE3194694 » Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #1 : Август 22, 2010, 14:19 »

Исправь на это:
Код:
GraphicImage = QPixmap::grabWindow(tabWidget->currentWidget()->winId(), 5, 30, width()-10, height()-85); //Делаю скриншот текущей вкладки на tabWidget'е.
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
baka
Гость
« Ответ #2 : Август 22, 2010, 17:07 »

надо просто,
Код:
GraphicImage.save(FileName, "PNG", 0);

вместо "PNG" можно "JPG" или "JPEG"(я точно не помню).
Записан
PulSar.CE3194694
Гость
« Ответ #3 : Август 22, 2010, 20:51 »

надо просто,
Код:
GraphicImage.save(FileName, "PNG", 0);

вместо "PNG" можно "JPG" или "JPEG"(я точно не помню).
Так вообще он ничего не сохраняет. Даже самого файла на жестком диске не создаётся.
Исправь на это:
Код:
GraphicImage = QPixmap::grabWindow(tabWidget->currentWidget()->winId(), 5, 30, width()-10, height()-85); //Делаю скриншот текущей вкладки на tabWidget'е.
Здесь небольшой прогресс есть, файл теперь ~20КБ, однако он ни просмотрщиком изображений Виндовс, ни Фотошопом не открывается... ХЗ что не так...
Записан
Anarion
Гость
« Ответ #4 : Август 23, 2010, 01:36 »

Так вообще он ничего не сохраняет. Даже самого файла на жестком диске не создаётся.
Ну если, например сделать так:
Код:
QPixmap screen = QPixmap::grabWindow(ui->tabWidget->currentWidget()->winId(),5,30,ui->tabWidget->currentWidget()->width()-10,ui->tabWidget->currentWidget()->height()-60);
  QString fileName("D:/picture");
  if (fileName.isNull())
    return;
  screen.save(fileName,"png",100);
,то файл действительно не будет показан на диске. Однако, если в строке адреса введешь "D:/picture", то он будет в списке Улыбающийся. В таком варианте просмоторщиками действительно не открывается. Не есть гуд, ибо все же занимает место. Я открыл его с помощью Notepad++, в нем же переименовал в picture.png (после этого стал видим на диске) и после этого он уже нормально открылся.

Возможно я что-то не понял, но у вас в вызове:
Код:
GraphicImage = QPixmap::grabWindow(tabWidget->currentWidget()->winId(), 5, 30, width()-10, height()-85); //Делаю скриншот текущей вкладки на tabWidget'е.
указан виджет для скриншота как вкладка tabWidget'a, а параметры ректа (width()-10, height()-85) используются от внешнего виждета. Возможно это некорректно скажется на захватываемую область в дальнейшем.

Можно использовать следующий код:
Код:
QPixmap screen = QPixmap::grabWindow(ui->tabWidget->currentWidget()->winId(),5,30,ui->tabWidget->currentWidget()->width()-10,ui->tabWidget->currentWidget()->height()-60);
  QString fileName = QFileDialog::getSaveFileName(0, "Сохранить как...", QDir::currentPath(), "All types(*.*);;PNG (*.png);;JPG (*jpeg *jpg);; BMP (*.bmp)");
  if (fileName.isNull())
    return;
  screen.save(fileName,0,100);
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #5 : Август 23, 2010, 08:28 »

Anarion
когда сохраняете, надо указыать полный путь, включая разрешение:
Код:
QString fileName("D:/picture.png");
Более того, в ф-ии save формат указывать необязательно - если его нет, система угадывает формат из расширения файла, под которым вы хотите сохранить. В доке это, кстати, написано. Формат же нужен, если есть несколько типов изображения, имеющих одинаковое расширение - пример жпег обычный и жпег 2000 (в Qt этого правда нет). Мне приходилось писать хэндлер текстуры, где было 12 разных вариантов изображения. Это в доке тоже где-то есть, сейчас правда не нашел.
Записан
PulSar.CE3194694
Гость
« Ответ #6 : Август 23, 2010, 09:38 »

Можно использовать следующий код:
Код:
QPixmap screen = QPixmap::grabWindow(ui->tabWidget->currentWidget()->winId(),5,30,ui->tabWidget->currentWidget()->width()-10,ui->tabWidget->currentWidget()->height()-60);
  QString fileName = QFileDialog::getSaveFileName(0, "Сохранить как...", QDir::currentPath(), "All types(*.*);;PNG (*.png);;JPG (*jpeg *jpg);; BMP (*.bmp)");
  if (fileName.isNull())
    return;
  screen.save(fileName,0,100);
Спасибо! Этот код помог! Теперь все без проблем сохраняет. С размерами видимой части изображения разберусь))
А как, интересно, делать, если использовать QFile и QDataStream?
Записан
Anarion
Гость
« Ответ #7 : Август 23, 2010, 12:06 »

Anarion
когда сохраняете, надо указыать полный путь, включая разрешение:
Код:
QString fileName("D:/picture.png");
Более того, в ф-ии save формат указывать необязательно - если его нет, система угадывает формат из расширения файла, под которым вы хотите сохранить. В доке это, кстати, написано. Формат же нужен, если есть несколько типов изображения, имеющих одинаковое расширение - пример жпег обычный и жпег 2000 (в Qt этого правда нет). Мне приходилось писать хэндлер текстуры, где было 12 разных вариантов изображения. Это в доке тоже где-то есть, сейчас правда не нашел.

Сам пользуюсь предложенным мною далее в том же сообщении варианте. Этот код я привел для проверки. Просто неясно, какие значения, кроме 0, может принимать параметр format в методе
Код:
bool QPixmap::save ( const QString & fileName, const char * format = 0, int quality = -1 ) const
Не 0 и 1 ведь, иначе бы был типа bool. Предположил, что это может быть тип, например "png", "jpg"... В таком случае в первом параметре const QString & fileName не имеет смысла указывать разрешение файла, отсюда и
Код:
QString fileName("D:/picture.png");
Но факт того, что файл присутствует на диске, имеет определенный объем и при этом не видим проводниками настораживает.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #8 : Август 23, 2010, 12:13 »

читайте доку внимаетльно. Никто не запрещает сохранить жпег файл с расширением .bmp
Записан
PulSar.CE3194694
Гость
« Ответ #9 : Август 24, 2010, 07:50 »

А как, интересно, делать, если использовать QFile и QDataStream?
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #10 : Август 24, 2010, 14:06 »

Цитировать
А как, интересно, делать, если использовать QFile и QDataStream?
Кстати, скорее всего никак..т.к. они сохраняют именно объект QPixmap, а QPixmap::Save сохраняет именно картинку.
Т.е. в первом случае, при открытии этого файла, мы можем вернуть обратно QPixmap себе с помощью >> оператора. Сериализация вроде называется..
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.541 секунд. Запросов: 23.