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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.03.2014, 18:50   #1
D-mon
Форумчанин
 
Регистрация: 22.06.2007
Сообщений: 414
По умолчанию Размер в КБ сожержимого TJpegImage

Привет всем.

Как узнать размер содержимого TJpegImage не сохраняя это содержимое в файл?
Если делать это через TMemoryStream, то рассчитывается размер изображения в памяти., а он там храниться в BMP.

Спасибо.
Нет невыполнимых задач, всё дело времени...
D-mon вне форума Ответить с цитированием
Старый 05.03.2014, 19:37   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
то рассчитывается размер изображения в памяти., а он там храниться в BMP.
Чего так решили? Загруженный из jpg-файла и выгруженный в стреам дает один и тот же размер без всякого преобразования в bmp
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.03.2014, 20:05   #3
D-mon
Форумчанин
 
Регистрация: 22.06.2007
Сообщений: 414
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Чего так решили?
Потому-что он в памяти лежит не сжатый, вот потому и размер отличается.
У меня на диске файл 30 КБ, а в памяти 78 КБ.
Нет невыполнимых задач, всё дело времени...
D-mon вне форума Ответить с цитированием
Старый 05.03.2014, 20:14   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Так тоже дает другой размер?
Код:
procedure TForm1.Button1Click(Sender: TObject);
var Image: TJpegImage;
    Stream: TMemoryStream;
begin
  Image:=TJpegImage.Create;
  Image.LoadFromFile('e:\Безымянный.jpg');
  Stream:=TMemoryStream.Create;
  Image.SaveToStream(Stream);
  Label1.Caption:=IntToStr(Stream.Size);
  Stream.Free;
  Image.Free;
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 06.03.2014, 12:52   #5
D-mon
Форумчанин
 
Регистрация: 22.06.2007
Сообщений: 414
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Так тоже дает другой размер?
Код:
procedure TForm1.Button1Click(Sender: TObject);
var Image: TJpegImage;
    Stream: TMemoryStream;
begin
  Image:=TJpegImage.Create;
  Image.LoadFromFile('e:\Безымянный.jpg');
  Stream:=TMemoryStream.Create;
  Image.SaveToStream(Stream);
  Label1.Caption:=IntToStr(Stream.Size);
  Stream.Free;
  Image.Free;
end;
Вот так как раз все работает.

Просто у меня все картинки находятся в базе, а не в файлах. И загружая их на клиентское приложение отображаю через TJpegImage выбирая нужную компрессию. Потом определяю размер фото через TMemoryStream, но он выдаёт размер больше чем на самом деле это изображение весит если сохранить его в файл.
Нет невыполнимых задач, всё дело времени...
D-mon вне форума Ответить с цитированием
Старый 06.03.2014, 13:40   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

И с компрессией нормально
Код:
procedure TForm1.Button1Click(Sender: TObject);
const FileName = 'e:\Безымянный.jpg';
      FileNameOut = 'e:\БезымянныйOut.jpg';
var JpegIn: TJpegImage;
    Bitmap: TBitmap;
    MS: TMemoryStream;
function GetFileSize(PFileName: String): Int64;
var FS: TFileStream;
begin
  FS:=TFileStream.Create(PFileName,fmOpenRead);
  Result:=FS.Size;
  FS.Free;
end;
begin
  {загрузили jpg из файла}
  Label1.Caption:=Format('Размер исходного файла - %d',[GetFileSize(FileName)]);
  JpegIn:=TJpegImage.Create;
  JpegIn.LoadFromFile(FileName);
  {сконвертировали в bmp}
  Bitmap:=TBitmap.Create;
  Bitmap.Assign(JpegIn);
  {компрессия}
  JpegIn.Assign(Bitmap);
  Bitmap.Free;
  JpegIn.CompressionQuality:=50;
  JpegIn.Compress;
  {посмотрели размер в стреам}
  MS:=TMemoryStream.Create;
  JpegIn.SaveToStream(MS);
  Label3.Caption:=Format('Размер в стреам - %d',[MS.Size]);
  MS.Free;
  {записали в файл}
  JpegIn.SaveToFile(FileNameOut);
  Label2.Caption:=Format('Размер выходного файла - %d',[GetFileSize(FileNameOut)]);
  JpegIn.Free;
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 06.03.2014 в 13:45.
Аватар вне форума Ответить с цитированием
Старый 06.03.2014, 19:29   #7
D-mon
Форумчанин
 
Регистрация: 22.06.2007
Сообщений: 414
По умолчанию

А как узнать какое значение установить параметру JpegIn.CompressionQuality что бы получить исходный размер?

Если этот же код да без этого
Код:
JpegIn.CompressionQuality:=50;
JpegIn.Compress;
то MS.Size не было бы равным GetFileSize(FileName).

Вот и остался вопрос, как в памяти посчитать КБ????
Нет невыполнимых задач, всё дело времени...
D-mon вне форума Ответить с цитированием
Старый 06.03.2014, 19:39   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

CompressionQuality методом тыка. По другому никак
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TBitMap / TJpegImage в потоках Puhovoi Общие вопросы Delphi 8 10.03.2013 16:49
Проблема с TJPEGImage ssman Мультимедиа в Delphi 2 29.05.2012 18:31
Ошибка конвертации TJPegImage to a TJpegImage Lokos Общие вопросы Delphi 8 20.10.2010 11:00
TGifImage TJpegImage TPngImage FantasyDD Компоненты Delphi 0 24.05.2010 15:41
Попиксельный доступ к TJPEGImage Serge_Bliznykov Общие вопросы Delphi 4 29.09.2009 22:57