Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сжатие, файлов 
:(
    Опции темы
Лена
Дата 22.11.2006, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 16.8.2006

Репутация: 11
Всего: 11



Может так обработать пустую картинку?
Код

auto_ptr<TMemoryStream> stream(new TMemoryStream());
 auto_ptr<TJPEGImage> jpeg (new TJPEGImage());
 DataModule2->ADOQueryXphoto->SaveToStream(stream.get());
 stream->Position = 0;
 if(!stream->Size) return;
 jpeg->LoadFromStream(stream.get());
  FormProsmotrFoto->Image1->Picture->Bitmap->Assign(jpeg.get());
 FormProsmotrFoto->ShowModal();

PM MAIL   Вверх
Vyacheslav
Дата 22.11.2006, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Цитата(Лена @  22.11.2006,  14:43 Найти цитируемый пост)
Похоже, CompressionQuality не работает. Пробовала так: CompressionQuality=10 получила тот же размер. Может для эксперимента перед отправкой сохранять файл с Compress(); на диск, а потом пробовать отправить его в базу, а после отправки временный файл удалять или все это ерунда?

Кстати , мне пришла такая же идея. Во всяком случае можно проверить изначальный размер  и после сжатия но до отсылки в БД

Цитата(Лена @  22.11.2006,  14:43 Найти цитируемый пост)
Раньше, если в базе не было картинки, DBImage был пустой, теперь загрузка в такой ситуации вызывает исключение. Как грамотнее его обработать? 

Код

if( DataModule2->ADOQueryXphoto->IsNull)
{
   FormProsmotrFoto->Image1->Picture->Bitmap->Assign(NULL) ;
   return;
}
auto_ptr<TMemoryStream> stream(new TMemoryStream());
 auto_ptr<TJPEGImage> jpeg (new TJPEGImage());
 DataModule2->ADOQueryXphoto->SaveToStream(stream.get());
 stream->Position = 0;
 jpeg->LoadFromStream(stream.get());
 FormProsmotrFoto->Image1->Picture->Bitmap->Assign(jpeg.get());
        



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Лена
Дата 22.11.2006, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 16.8.2006

Репутация: 11
Всего: 11



Не знаю как будет дальше, но сейчас весь код очень хорошо работает и устойчиво:
Отправка:
Код

void __fastcall TFormFoto::Button1Click(TObject *Sender)
{
//отправить фото в базу
if (AdvPicture1->Picture->Empty==true)
{
  ShowMessage("Необходимо выбрать фотографию");
  return;
}

  try{

      TWaitCursor cursor(crSQLWait);
      AnsiString  fileName = PathFolder;
      AnsiString EXE = ExtractFileExt(fileName);
       if( EXE ==".jpg" || EXE ==".jpeg" || EXE ==".JPG" || EXE ==".JPEG")
          {
          auto_ptr<TMemoryStream> stream(new TMemoryStream());
          auto_ptr<TJPEGImage> jpeg (new TJPEGImage());

          jpeg->LoadFromFile(fileName);
          jpeg->CompressionQuality = 10;
          //jpeg->Compress();
          jpeg->SaveToStream(stream.get());
          stream->Position = 0;
          DataModule2->ADOQueryPhoto->Parameters->ParamByName("img")->LoadFromStream(stream.get(), ftBlob);
          DataModule2->ADOQueryPhoto->Parameters->ParamByName("id")->Value = DataModule2->ClientDataSetVisid->AsInteger;
          DataModule2->ADOQueryPhoto->ExecSQL();
          }
          else{

               ShowMessage("Не правильное расширение файла фотографии");
               return;
               }
     }
     catch(...)
           {
            ShowMessage("Не удалось отправить фотографию в базу");
           }

}


Получение фотографии:
Код

void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
 try{
 FormProsmotrFoto->Top = Form1->Top;
 FormProsmotrFoto->Left = Form1->Left  + Form1->Width - FormProsmotrFoto->Width;
 FormProsmotrFoto->Label1->Caption = DataModule2->ClientDataSetVis->FieldByName("lastname")->AsString +
        " " + DataModule2->ClientDataSetVis->FieldByName("firstname")->AsString +
                " " + DataModule2->ClientDataSetVis->FieldByName("patronymic")->AsString +
                        " " + DataModule2->ClientDataSetVis->FieldByName("post")->AsString;


          TWaitCursor cursor(crSQLWait);
          DataModule2->ADOQueryX->Active = false;
          DataModule2->ADOQueryX->Parameters->ParamByName("cur")->Value = DataModule2->ClientDataSetVisid->AsInteger;
          DataModule2->ADOQueryX->Active = true;


 if( DataModule2->ADOQueryXphoto->IsNull)
   {
   FormProsmotrFoto->Image1->Picture->Bitmap->Assign(NULL) ;
   ShowMessage(FormProsmotrFoto->Label1->Caption + " не имеет фотографии в базе");
   return;
   }
     auto_ptr<TMemoryStream> stream(new TMemoryStream());
     auto_ptr<TJPEGImage> jpeg (new TJPEGImage());
     DataModule2->ADOQueryXphoto->SaveToStream(stream.get());
     stream->Position = 0;
     jpeg->LoadFromStream(stream.get());
     FormProsmotrFoto->Image1->Picture->Bitmap->Assign(jpeg.get());
     FormProsmotrFoto->ShowModal();
 }
  catch(...)
   {
    ShowMessage("Не удалось загрузить фотографию");
   }
}


Удаление фотографии:
Код

void __fastcall TFormProsmotrFoto::ButtonDropFotoClick(TObject *Sender)
{

          try{
          TWaitCursor cursor(crSQLWait);
          //удаление
          DataModule2->ADOQueryX->Active = false;
          DataModule2->ADOQueryX->SQL->Clear();
          DataModule2->ADOQueryX->SQL->Add("UPDATE photos SET photo=NULL WHERE id =:cur");
          DataModule2->ADOQueryX->Parameters->ParamByName("cur")->Value = DataModule2->ClientDataSetVisid->AsInteger;
          DataModule2->ADOQueryX->ExecSQL();

          //возвращение запроса
          DataModule2->ADOQueryX->Active = false;
          DataModule2->ADOQueryX->SQL->Clear();
          DataModule2->ADOQueryX->SQL->Add("select photo from photos where id=:cur");
          DataModule2->ADOQueryX->Parameters->ParamByName("cur")->Value = DataModule2->ClientDataSetVisid->AsInteger;
          DataModule2->ADOQueryX->Active = true;
          FormProsmotrFoto->Image1->Picture->Bitmap->Assign(NULL) ;
           }
           catch(...)
              {
               ShowMessage("Не удалось удалить фотографию");
              }

}


Вообщем УРА!  smile 



Это сообщение отредактировал(а) Лена - 22.11.2006, 15:59
PM MAIL   Вверх
Vyacheslav
Дата 22.11.2006, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Замечание.
За такие
Код

 catch(...)
   {
    ShowMessage("Не удалось загрузить фотографию");
   }

я своих подчиненных расстреливаю. Чтоб не  мучались. smile
Правильно было бы сделать что-то вроде этого
Код

 catch(Exception* ex)
   {
    //записать в лог-файл содержимой оригинального сообщения
    WriteToLog(ex->Message);
    ShowMessage("Не удалось загрузить фотографию");
   }

WriteToLog - это конечно своя функция.
А вообще у меня был свой диалоговое окно, где при подобной ситуации высветилось сообщение "Не удалось загрузить фотографию". Это там, где на рисунке сейчас стоит по умолчанию "Программа выполнила недопустимую операцию" А если пользователь нажмет на кнопку, то диалоговое окно распахнется и  там будет подробная информация, которая автоматом запишется в лог. По этой информации можно достаточно быстро локализовать и пофиксить баг, не приставая к пользователю с вопросами типа :"А ну-ка покажи, что ты сделал, чтобы получить такую ситуацию"

Добавлено @ 16:36 
Ну и вся обработка ошибок примерно выполнялась следующим образом
Код

void __fastcall TMainDataModule::ApplicationEventsException(
      TObject *a_Sender, Exception *a_Exc)
{
    // Если это клиентское исключение, то просто выдаем сообщение..
     if (EipException* Exc = dynamic_cast<EipException*>(a_Exc))
        {
            Exc->Show();
            return;
        }
        // Если это серьезная ошибка
        std::auto_ptr<TErrorDialog> Dlg(new TErrorDialog(this, a_Exc,a_Sender));
        Dlg->ShowModal();
        // если ошибка произошла при входе в систему,
        // прекращаем работу
        if (m_Logining)
            Application->Terminate();
 }



Присоединённый файл ( Кол-во скачиваний: 13 )
Присоединённый файл  except.jpg 23,39 Kb


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Лена
Дата 22.11.2006, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 16.8.2006

Репутация: 11
Всего: 11



Да, файл лог обязательно добавлю.
PM MAIL   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0567 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.