![]() |
|
|
![]()
|
|
| Лена |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 16.8.2006 Репутация: 11 Всего: 11 |
Если открыть в профессиональном графическом редакторе (например, в CorelPHOTO-PAINT или Adobe Photoshop) фотографию JPG созданную цифровым фотоаппаратом размером 1.5 Мгб и сохранить ее (например, с установками по умолчанию), то получим файл размером 600-800 Кб и он будет хорошего качества. Можно ли средствами C++ Builder (или сторонними компонентами) реализовать сжатие jpg файлов?
|
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Здрасте, приехали
TJPEGImage::Compess -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| Лена |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 16.8.2006 Репутация: 11 Всего: 11 |
Примерно так?:
|
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Угу
Добавлено @ 16:16 Опс... Не так. Что же Вы делаете? Сначала jpeg в bmp преобразуете, а потом jpeg сжимаете Надо сначала сжать, а потом уж преобразовать
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| Лена |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 16.8.2006 Репутация: 11 Всего: 11 |
Понятно.
Что может означать эта ошибка после добавления этих двух строк? В файле jpeg.hpp цифры 41 не нашла. Исключение на строке: bitmap->Assign(jpeg.get()); Это сообщение отредактировал(а) Лена - 21.11.2006, 16:47 Присоединённый файл ( Кол-во скачиваний: 20 )
1.gif 5,60 Kb |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Попробуйте добавить
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| Лена |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 16.8.2006 Репутация: 11 Всего: 11 |
Та же ошибка осталась. Не хочет jpg переделываться в bmp. Добавлено @ 17:20 Вот так сработало: jpeg->DIBNeeded(); jpeg->CompressionQuality = 80; или даже так: jpeg->CompressionQuality = 10; //все равно 9 МгБ jpeg->Compress(); Однако я сделала сохранение на диск для проверки. В результате получила размер фотографии 9 Мгб, исходная была 1.8 Мгб. Это сообщение отредактировал(а) Лена - 21.11.2006, 17:28 |
|||
|
||||
| Лена |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 16.8.2006 Репутация: 11 Всего: 11 |
В качестве эксперимента сделала черно-белую:
Получила 3МгБ. Очевидно не удасться записывать в базу зажатые jpg потому что они разжимаются когда превращаются в битмап. |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Скорее всего так и есть. Есть выход - хранить все в формате JPEG. Только сохранять и доставать придется ручками
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| Лена |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 16.8.2006 Репутация: 11 Всего: 11 |
||||
|
||||
| Vyacheslav |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
В БД можно записать все что угодно
Примерный план следующий 1. Yбрать TGraphicField, вместо него установить TBlobField 2. Изменить код
3. Заменить DBImage на Image 4. Вычитывать картинку из БД примерно так
-------------------- С уважением, Вячеслав Ермолаев |
||||
|
|||||
| Лена |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 16.8.2006 Репутация: 11 Всего: 11 |
Cпасибо попробую переделать. Согласно последней вводной, нужна поддрежка только JPG (bmp не будет).
|
|||
|
||||
| Лена |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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' |
|||
|
||||
| Vyacheslav |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Ну естественно. Надеюсь Вы уже исправли
И насчет ADOQueryPhoto не уверен. Вы уж поставте тот, у которого запрос в select photo from photos where id = :id. ADOQueryX кажется ? -------------------- С уважением, Вячеслав Ермолаев |
||||
|
|||||
| Лена |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 16.8.2006 Репутация: 11 Всего: 11 |
Я пробывала оба варианта. Если так:
то тоже ошибка: [C++ Error] MDataBase.cpp(1127): E2316 'SaveToStream' is not a member of 'TField' |
|||
|
||||
| Coala |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 70 Регистрация: 4.5.2006 Где: Москва Репутация: нет Всего: 0 |
Это сообщение отредактировал(а) Coala - 22.11.2006, 11:28 |
|||
|
||||
| Vyacheslav |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Лена. Крутимся по кругу.
Должно быть не TField, а TBlobField? У Вас он действительно TField? В конце концов я набираю по памяти. Немного фантазии и можно так
или так
У меня же Вашего кода нет, а у Вас есть -------------------- С уважением, Вячеслав Ермолаев |
||||
|
|||||
| Лена |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 16.8.2006 Репутация: 11 Всего: 11 |
Теперь понятно. Надо обращаться не посредственно к имени поля ADOQueryXphoto.
Новый код отправки вызвает ошибку №1
При добавлении строки jpeg->DIBNeeded(); в код выше получаю ошибку N2 Код получение информации из бызы вызвает ошибку N3:
Присоединённый файл ( Кол-во скачиваний: 8 )
1.gif 22,89 Kb |
||||
|
|||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
1)Тип параметра img?
2) jpeg->DIBNeeded() ? Зачем он здесь 3) Пустая запись? -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| Лена |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 16.8.2006 Репутация: 11 Всего: 11 |
Тип параметра не меняла ftBlob Его нет, просто проверила. Сначала старым рабочим кодом занесла jpg файл в базу:
Затем попробывала прочитать. Ошибка №3. Аналогичная ошибка при попытке прочитать пустое поле из базы. |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Ваш код чтения из БД целиком давайте.
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| Лена |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 16.8.2006 Репутация: 11 Всего: 11 |
Сейчас такой:
Раньше был такой:
|
||||
|
|||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
А где,в текущем коде запрос в БД? Он же никуда не делся и должен был перкочевать из предыдущей версии. Вы дожны были просто добавить дополнительный код
Естественно Вы вытаскиваете пустую запись -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| Лена |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 16.8.2006 Репутация: 11 Всего: 11 |
Заношу в базу старым кодом:
Читаю новым кодом:
Ошибка на рисунке. Попытка занести новым кодом, ругается попрежнему на параметр.
Это сообщение отредактировал(а) Лена - 22.11.2006, 13:22 Присоединённый файл ( Кол-во скачиваний: 7 )
1.gif 5,78 Kb |
||||||
|
|||||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Лена. Читать с помощью нового кода информацию, записанную старым кодом бессмысленно. У Вас старым кодом записывается формат BMP
Добавлено @ 13:33 Уберите jpeg->Compress(); -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| Лена |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 16.8.2006 Репутация: 11 Всего: 11 |
||||
|
||||
| Vyacheslav |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Ответ не верный
Дайте код как проверяли Надеюсь, что так (правильно)
или так (неправильно)
-------------------- С уважением, Вячеслав Ермолаев |
||||
|
|||||
| Лена |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 16.8.2006 Репутация: 11 Всего: 11 |
Полученная таким образом картинка, точно соотвествует исходной по размеру и равняется 1.8 МгБ. Видимо Compress(); нужен, но он портит параметр. |
|||
|
||||
| Vyacheslav |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Ага. Значит проверяли изначально все таки неправильно.
Ну судя по хелпу
Этого должно быть достаточно
без вызова Compress; Добавлено @ 14:40 Прочитав вниматльно
а CompressionQuality используется при сохранении jpeg
-------------------- С уважением, Вячеслав Ермолаев |
||||||||
|
|||||||||
| Лена |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 16.8.2006 Репутация: 11 Всего: 11 |
Пока писала сообщения получила новое разъяснения по Compress от вас.
Хочу отметить, что новый код загрузки:
мне кажется, работает надежнее. У меня была одна картинка jpeg размеров всего 700 Кб, так мой прошлый код загрузки выдавал исключение (переполнение буфера и прочее). Этот код загрузил эту картинку в базу нормально. Раньше, если в базе не было картинки, DBImage был пустой, теперь загрузка в такой ситуации вызывает исключение. Как грамотнее его обработать? Похоже, CompressionQuality не работает. Пробовала так: CompressionQuality=10 получила тот же размер. Может для эксперимента перед отправкой сохранять файл с Compress(); на диск, а потом пробовать отправить его в базу, а после отправки временный файл удалять или все это ерунда? Это сообщение отредактировал(а) Лена - 22.11.2006, 14:44 |
|||
|
||||
| Лена |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 16.8.2006 Репутация: 11 Всего: 11 |
Может так обработать пустую картинку?
|
|||
|
||||
| Vyacheslav |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Кстати , мне пришла такая же идея. Во всяком случае можно проверить изначальный размер и после сжатия но до отсылки в БД
-------------------- С уважением, Вячеслав Ермолаев |
||||
|
|||||
| Лена |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 16.8.2006 Репутация: 11 Всего: 11 |
Не знаю как будет дальше, но сейчас весь код очень хорошо работает и устойчиво:
Отправка:
Получение фотографии:
Удаление фотографии:
Вообщем УРА! Это сообщение отредактировал(а) Лена - 22.11.2006, 15:59 |
||||||
|
|||||||
| Vyacheslav |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Замечание.
За такие
я своих подчиненных расстреливаю. Чтоб не мучались. Правильно было бы сделать что-то вроде этого
WriteToLog - это конечно своя функция. А вообще у меня был свой диалоговое окно, где при подобной ситуации высветилось сообщение "Не удалось загрузить фотографию". Это там, где на рисунке сейчас стоит по умолчанию "Программа выполнила недопустимую операцию" А если пользователь нажмет на кнопку, то диалоговое окно распахнется и там будет подробная информация, которая автоматом запишется в лог. По этой информации можно достаточно быстро локализовать и пофиксить баг, не приставая к пользователю с вопросами типа :"А ну-ка покажи, что ты сделал, чтобы получить такую ситуацию" Добавлено @ 16:36 Ну и вся обработка ошибок примерно выполнялась следующим образом
Присоединённый файл ( Кол-во скачиваний: 13 )
except.jpg 23,39 Kb-------------------- С уважением, Вячеслав Ермолаев |
||||||
|
|||||||
| Лена |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 16.8.2006 Репутация: 11 Всего: 11 |
Да, файл лог обязательно добавлю.
|
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |