Поиск:

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


Опытный
**


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

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



Если открыть в профессиональном графическом редакторе (например, в CorelPHOTO-PAINT или Adobe Photoshop) фотографию JPG созданную цифровым фотоаппаратом размером 1.5 Мгб и сохранить ее (например, с установками по умолчанию), то получим файл размером 600-800 Кб и он будет хорошего качества. Можно ли средствами C++ Builder (или сторонними компонентами) реализовать сжатие jpg файлов?

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


Эксперт
****


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

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



Здрасте, приехали smile

TJPEGImage::Compess 


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


Опытный
**


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

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



 smile 
Примерно так?:
Код

if( EXE ==".jpg" || EXE ==".jpeg" || EXE ==".JPG" || EXE ==".JPEG")
         {
            auto_ptr<TJPEGImage> jpeg (new TJPEGImage());
            jpeg->LoadFromFile(fileName);
            bitmap->Assign(jpeg.get());
            jpeg->CompressionQuality = 80;
            jpeg->Compress();
         }

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


Эксперт
****


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

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



Угу

Добавлено @ 16:16 
Опс...  Не так.
Что же Вы делаете? Сначала jpeg в bmp преобразуете, а потом   jpeg  сжимаете
Надо сначала сжать, а потом уж преобразовать
Код

if( EXE ==".jpg" || EXE ==".jpeg" || EXE ==".JPG" || EXE ==".JPEG")
         {
            auto_ptr<TJPEGImage> jpeg (new TJPEGImage());
            jpeg->LoadFromFile(fileName);
            jpeg->CompressionQuality = 80;
            jpeg->Compress();
            bitmap->Assign(jpeg.get());

         }




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


Опытный
**


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

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



Понятно.
Что может означать эта ошибка после добавления этих двух строк? В файле jpeg.hpp цифры 41 не нашла.  smile 


Исключение на строке:  bitmap->Assign(jpeg.get());

Это сообщение отредактировал(а) Лена - 21.11.2006, 16:47

Присоединённый файл ( Кол-во скачиваний: 20 )
Присоединённый файл  1.gif 5,60 Kb
PM MAIL   Вверх
Vyacheslav
Дата 21.11.2006, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Попробуйте добавить
Код

jpeg->Compress();
jpeg->DIBNeeded();
bitmap->Assign(jpeg.get());




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


Опытный
**


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

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



Цитата(Vyacheslav @  21.11.2006,  17:10 Найти цитируемый пост)
jpeg->DIBNeeded();


Та же ошибка осталась. Не хочет jpg переделываться в bmp.  smile

Добавлено @ 17:20 
Вот так сработало:
jpeg->DIBNeeded();
jpeg->CompressionQuality = 80;
или даже так:
jpeg->CompressionQuality = 10; //все равно 9 МгБ
jpeg->Compress();
Однако я сделала сохранение на диск для проверки. В результате получила размер фотографии 9 Мгб, исходная была 1.8 Мгб.  smile 

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


Опытный
**


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

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



В качестве эксперимента сделала черно-белую:
Код

     if( EXE ==".jpg" || EXE ==".jpeg" || EXE ==".JPG" || EXE ==".JPEG")
         {
            auto_ptr<TJPEGImage> jpeg (new TJPEGImage());
            jpeg->LoadFromFile(fileName);
            jpeg->Grayscale = true;
            jpeg->DIBNeeded();
            jpeg->CompressionQuality = 10;
            jpeg->Compress();

            bitmap->Assign(jpeg.get());

         }
           else
           {
               bitmap->LoadFromFile(fileName);
           }
      bitmap->SaveToStream(stream.get());
      bitmap->SaveToFile("1234.jpg");
//*************


Получила 3МгБ. Очевидно не удасться записывать в базу зажатые jpg потому что они разжимаются когда превращаются в битмап.  smile 
PM MAIL   Вверх
Vyacheslav
Дата 21.11.2006, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Скорее всего так и есть. Есть выход  - хранить все в формате JPEG. Только сохранять и доставать придется ручками


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


Опытный
**


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

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



Цитата(Vyacheslav @  21.11.2006,  17:58 Найти цитируемый пост)
Есть выход  - хранить все в формате JPEG.


Не поняла. Хранить картинки не в базе? Ведь в базу JPEG не записываются?

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


Эксперт
****


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

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



В БД можно записать все что угодно smile и прочитатать все что угодно, если делать ручками
Примерный план следующий 
1. Yбрать TGraphicField, вместо него установить TBlobField
2. Изменить код
Код

try{

  TWaitCursor cursor(crSQLWait);
  AnsiString  fileName = ThumbnailList1->Thumbnails->Items[ThumbnailList1->ItemIndex]->Filename;
  auto_ptr<TMemoryStream> stream(new TMemoryStream());
  auto_ptr<TJPEGImage> jpeg (new TJPEGImage());
 
  AnsiString EXE = ExtractFileExt(fileName);
  if( EXE ==".bmp" || EXE ==".BMP" )
  {
        auto_ptr<Graphics::TBitmap> bitmap(new Graphics::TBitmap()); 
        bitmap->LoadFromFile(fileName);
        jpeg->Assign(bitmap.get());
  }
  jpeg->CompressionQuality = 80;
  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();
 }
 catch(...)
       {
        ShowMessage("Не удалось отправить фотографию в базу");
       } 



3. Заменить  DBImage на Image
4. Вычитывать картинку из БД примерно так
Код

  auto_ptr<TMemoryStream> stream(new TMemoryStream());
  auto_ptr<TJPEGImage> jpeg (new TJPEGImage());
  DataModule2->ADOQueryPhoto->Parameters->ParamByName("img")->SaveToStream(stream.get());
 stream->Position = 0;
 jpeg->LoadFromStream(stream.get());
 Image1->Picture->Bitmap->Assign(jpeg.get());







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


Опытный
**


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

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



Cпасибо попробую переделать. Согласно последней вводной, нужна поддрежка только JPG (bmp не будет).  smile 

PM MAIL   Вверх
Лена
Дата 21.11.2006, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ошибка тут:
DataModule2->ADOQueryPhoto->Parameters->ParamByName("img")->SaveToStream(stream.get());

[C++ Error] MDataBase.cpp(1124): E2316 'SaveToStream' is not a member of 'TParameter'
PM MAIL   Вверх
Vyacheslav
Дата 21.11.2006, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Лена @  21.11.2006,  19:06 Найти цитируемый пост)
DataModule2->ADOQueryPhoto->Parameters->ParamByName("img")->SaveToStream(stream.get());

Ну естественно. Надеюсь Вы уже исправли smile на
Код

DataModule2->ADOQueryPhoto->FieldByName("photo")->SaveToStream(stream.get());


И насчет ADOQueryPhoto не уверен. Вы  уж поставте тот, у которого запрос в  select photo from photos where id = :id. ADOQueryX кажется ?



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


Опытный
**


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

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



Цитата(Vyacheslav @  21.11.2006,  20:05 Найти цитируемый пост)
Вы уже исправли 


Я пробывала оба варианта. Если так:
Код

auto_ptr<TMemoryStream> stream(new TMemoryStream());
 auto_ptr<TJPEGImage> jpeg (new TJPEGImage());
 DataModule2->ADOQueryX->FieldByName("photo")->SaveToStream(stream.get());
 stream->Position = 0;
 jpeg->LoadFromStream(stream.get());
 FormProsmotrFoto->Image1->Picture->Bitmap->Assign(jpeg.get());
 FormProsmotrFoto->ShowModal();

то тоже ошибка:
[C++ Error] MDataBase.cpp(1127): E2316 'SaveToStream' is not a member of 'TField'
 smile 
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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