Russian Qt Forum

Qt => Мультимедиа => Тема начата: PulSar.CE3194694 от Август 22, 2010, 11:44



Название: [Решено] Сохранение изображения в файл
Отправлено: 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(); //После записи закрываем файл.
}

Где здесь ошибка?))


Название: Re: Сохранение изображения в файл
Отправлено: kibsoft от Август 22, 2010, 14:19
Исправь на это:
Код:
GraphicImage = QPixmap::grabWindow(tabWidget->currentWidget()->winId(), 5, 30, width()-10, height()-85); //Делаю скриншот текущей вкладки на tabWidget'е.


Название: Re: Сохранение изображения в файл
Отправлено: baka от Август 22, 2010, 17:07
надо просто,
Код:
GraphicImage.save(FileName, "PNG", 0);

вместо "PNG" можно "JPG" или "JPEG"(я точно не помню).


Название: Re: Сохранение изображения в файл
Отправлено: PulSar.CE3194694 от Август 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КБ, однако он ни просмотрщиком изображений Виндовс, ни Фотошопом не открывается... ХЗ что не так...


Название: Re: Сохранение изображения в файл
Отправлено: Anarion от Август 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);


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


Название: Re: Сохранение изображения в файл
Отправлено: PulSar.CE3194694 от Август 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?


Название: Re: Сохранение изображения в файл
Отправлено: Anarion от Август 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");
Но факт того, что файл присутствует на диске, имеет определенный объем и при этом не видим проводниками настораживает.


Название: Re: Сохранение изображения в файл
Отправлено: Авварон от Август 23, 2010, 12:13
читайте доку внимаетльно. Никто не запрещает сохранить жпег файл с расширением .bmp


Название: Re: Сохранение изображения в файл
Отправлено: PulSar.CE3194694 от Август 24, 2010, 07:50
А как, интересно, делать, если использовать QFile и QDataStream?


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