Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2010, 17:00   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
Вопрос BMP, JPG скриншоты экрана. Большой размер файлов даже с использованием компрессии.

Привет=)
написал программу для снятия скриншотов экрана.. в ручном и автоматическом режиме(через таймер).

Но тут 2 проблемы..
1)
BMP изображение получается весом 5 Мб. (в bmp нет компрессии).
При выборе JPG тоже самое 5 Мб. (В JPG использую компрессию).

2)
далее при определённом кол-ве отснятого матерьяла программа выдает ошибку об нехватке места(где его нехватает я так и не понимаю(ПЗУ 25 Гб свободно, 2 Гб ОЗУ свободно)) =)

Вот исходник+готовый экземпляр , если можете помогите.

Исходник нуждается в AlphaSkins и CoolTray компоненте.
Вложения
Тип файла: zip src.zip (230.9 Кб, 19 просмотров)

Последний раз редактировалось Человек_Борща; 05.04.2010 в 18:05.
Человек_Борща вне форума Ответить с цитированием
Старый 05.04.2010, 17:24   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

на будущее exe нам ни к чему.

Код:
if SettingsForm.JPEGFormatFileChk.Checked then
begin
bm:=TBitmap.Create;
bm.Width:=Screen.Width;
bm.Height:=Screen.Height;
BitBlt(bm.Canvas.Handle,0,0,bm.Width,bm.Height,GetDC(0),0,0, SRCCOPY);
jp:=TJPEGImage.Create;
jp.Assign(bm);
jp.CompressionQuality:=SettingsForm.CompressionBar.Position;
jp.Compress;

bm.SaveToFile(IntToStr(StrToInt(SettingsForm.FileNameEdit.Text)+StrToInt(LabCount.Caption))+'.jpg');
end;
зачем то создаете JPEG и сохраняете все так же bmp

а вот по второму пункту буду громко ругатся.
ну где освобождение памяти?(удаление созданных обьектов?)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.04.2010, 18:15   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

спасибо учел.. обновил архив первого поста.

хм странно.. расставил
Код:
bm.free

jp.free
но проблема осталась...
При достижении определенного кол-ва на счетчике пишет что нет места.

Думаю что это буфер виноват, как я понимаю:
Нажатие кнопки=>скрин=>буфер=>папка...

дело в SCRCOPY.. как по другому можно?
или .. Сделать скрин=>Буфер=>папка=>очистить буфер=> сделать скрин.


Насчет JPEG.. вы знаете способ снятия скриншота и сохранение в JPEG без использования BitMap?
Человек_Борща вне форума Ответить с цитированием
Старый 05.04.2010, 18:39   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а разве код изменился?
Код:
procedure TMainForm.GetScreenBtnClick(Sender: TObject);
  var
    jp:TJPEGImage;
    bm:TBitmap;
    i:string;
begin
i:='1';
if SettingsForm.JPEGFormatFileChk.Checked then
begin
bm:=TBitmap.Create;
bm.Width:=Screen.Width;
bm.Height:=Screen.Height;
BitBlt(bm.Canvas.Handle,0,0,bm.Width,bm.Height,GetDC(0),0,0, SRCCOPY);
jp:=TJPEGImage.Create;
jp.Assign(bm);
jp.CompressionQuality:=SettingsForm.CompressionBar.Position;
jp.Compress;

jp.SaveToFile(IntToStr(StrToInt(SettingsForm.FileNameEdit.Text)+StrToInt(LabCount.Caption))+'.jpg');
jp.free;
bm.free;
end;

if SettingsForm.BMPFormatFileChk.Checked then
begin
bm:=TBitmap.Create;
bm.Width:=Screen.Width;
bm.Height:=Screen.Height;
BitBlt(bm.Canvas.Handle,0,0,bm.Width,bm.Height,GetDC(0),0,0, SRCCOPY);
bm.SaveToFile(IntToStr(StrToInt(SettingsForm.FileNameEdit.Text)+StrToInt(LabCount.Caption))+'.bmp');
bm.free;
end;

LabCount.Caption:=IntToStr(StrToInt(LabCount.Caption)+StrToInt(i));
StatusBar.Panels[0].Text:=IntToStr(StrToInt(StatusBar.Panels[0].Text)+StrToInt(i));
end;
красное то что исправил.

Цитата:
дело в SCRCOPY
интерестно откуда такие данные?
и вообще, откуда претензии к флагу копирования изображения?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.04.2010, 19:10   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

=) спасибо заработало...
Код:
jp.SaveToFile(IntToStr(StrToInt(SettingsForm.FileNameEdit.Text)+StrToInt(LabCount.Caption))+'.jpg');
jp.free;
bm.free;
я поставил там jp.free bm.Free но не заметил что там не jp.Save
а bm.save..

теперь работает. Спасибо.
а с первым постом налажал.. в делфи исправил сохранить забыл.
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
программа на С++ для компрессии/декомпрессии файлов mephistophel Общие вопросы C/C++ 6 10.03.2010 21:15
Слишком большой размер! Egik_net Microsoft Office Access 2 28.11.2009 16:38
Большой размер пустой страницы AVBel Microsoft Office Excel 10 11.11.2008 11:24
Проблема преобразование jpg в bmp через dll inndim Общие вопросы Delphi 5 24.06.2008 18:24
Помогите плз с bmp и jpg Svetik Общие вопросы C/C++ 4 27.11.2007 19:00