Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.09;
Скачать: CL | DM;

Вниз

BitMap   Найти похожие ветки 

 
ser_ega   (2004-10-05 21:17) [0]

Мастера помогите!
Можна ли узнать какой размер битмапа (в байтах) без сохранения его на винт?


 
Mihey_temporary ©   (2004-10-05 21:26) [1]

Можно прикинуть. Битмап - это примерно TBitmapInfoHeader и массив Width * Height пикселей, на каждый из которых приходится некоторое количество байт (или бит), зависящее от PixelFormat. Поищи через Google про TBitmapInfoHeader, а про размер одной строки вытяни отсюда:

http://delphibase.endimus.ru/?action=viewfunc&topic=mediaimg&id=10553


 
Fenik   (2004-10-05 22:15) [2]

> Mihey_temporary ©  (05.10.04 21:26) [1]
> а про размер одной строки вытяни отсюда:

Там маленько неверно оределяется для 1 и 4-битных однострочных растров - иногда на один, пол- байта больше чем надо. CompareMem это совершенно фмолетово, а для определения точного размера можно обойти просто:
Height := 2;
LineLength := Abs(Integer(ScanLine[0]) - Integer(ScanLine[1]));
Height := 1;
8-))))))


 
Mihey_temporary ©   (2004-10-05 22:49) [3]


> Там маленько неверно оределяется для 1 и 4-битных однострочных
> растров - иногда на один, пол- байта больше чем надо. CompareMem
> это совершенно фмолетово, а для определения точного размера
> можно обойти просто:
> Height := 2;
> LineLength := Abs(Integer(ScanLine[0]) - Integer(ScanLine[1]));
> Height := 1;
> 8-))))))


А можно по-подробнее где и что неточно. Ты имеешь ввиду выравнивание до байта? И про Height объясни - зачем менять?


 
miek   (2004-10-05 22:59) [4]

А по-моему, проще всего сохранить его в MemoryStream и взять готовый размер оттуда.


 
ser_ega   (2004-10-06 21:48) [5]

Вообщим я понял что это гиблое дело! Прийдется сохранять на винт! Так легче мне кажется! Спасибо всем!


 
DeadMeat ©   (2004-10-06 22:02) [6]

А теперь сравни.
Так, как ты хочешь:
1) Получить путь папки temp
2) Сохранить файл в эту папку под уникальным именем
3) Загрузить этот файл
4) Посчитать его размер

Так, как тебе предложили:
1) Получить высоту, ширину и количество бит на цвет (PixelFormat) битмапа
2) Вычислить нужный размер

Конечно многое зависит от того, как ты получил этот битмап.

---
...Death Is Only The Begining...


 
Fenik   (2004-10-06 23:33) [7]

> Mihey_temporary ©
> Ты имеешь ввиду выравнивание до байта?


Да.

> И про Height объясни - зачем менять?

Если будет обращение к ScanLine[1], когда высота меньше двух, выскочит AV.

И вообще моя функция сравнения растров недоделана - нет сравнения палитр. Попрошу удалить её и доработаю.

По поводу данной темы. Вот функция, которая в большинстве случаев дает верный результат:

function GetBitmapSize(Bitmap: TBitmap): LongInt;
var B: Boolean;
   MemH: Word;
begin
 with Bitmap do begin
   Result := SizeOf(TBitmapInfoHeader) + SizeOf(TBitmapFileHeader);
   case PixelFormat of
     pf1Bit:  Inc(Result, 8);    { Палитра из 2 цветов }
     pf4Bit:  Inc(Result, 64);   { Палитра из 16 цветов }
     pf8Bit:  Inc(Result, 1024); { Палитра из 256 цветов }
     pf16Bit: Inc(Result, 12);   { Вывел опытным путем. Похоже, что маска. }
   end;
   MemH := Height;
   B := Height < 2;
   if B then Height := 2;
   Inc(Result, Abs(Integer(ScanLine[0])-Integer(ScanLine[1]))*MemH);
   if B then Height := MemH;
 end;
end;


Но рабоет она верно, только когда разрешение стандартное - 96х96 (пиксел на дюйм). И с монохромными что-то не так. Короче, надо копаться...

Точный результат даст совет > miek  (05.10.04 22:59) [4] -

function GetBitmapSize(Bitmap: TBitmap): LongInt;
var Mem: TMemoryStream;
begin
 Mem := TMemoryStream.Create;
 try
   Bitmap.SaveToStream(Mem);
   Result := Mem.Size;
 finally
   Mem.Free;
 end;
end;


Но если размеры растра внушительные, думаю это далеко не оптимальный вариант.

> DeadMeat ©  (06.10.04 22:02) [6]
> А теперь сравни.
> Так, как ты хочешь:


Он же сказал, что хочет не сохраняя на диск узнать размер.


 
Fenik   (2004-10-06 23:36) [8]

> ser_ega  (06.10.04 21:48) [5]
> Вообщим я понял что это гиблое дело! Прийдется сохранять на винт! Так легче мне кажется! Спасибо всем!


Это худший вариант :))
И дело это совсем не гиблое. Читай [7].



Страницы: 1 вся ветка

Текущий архив: 2005.01.09;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.044 c
1-1103705554
Саша
2004-12-22 11:52
2005.01.09
Вариантный массив


14-1103608099
Ломброзо
2004-12-21 08:48
2005.01.09
Организация сетки


14-1103559977
syte_ser78
2004-12-20 19:26
2005.01.09
Half life2


14-1103617283
Prohodil Mimo
2004-12-21 11:21
2005.01.09
Где найти прогу для IR-пульта?


3-1102661653
moor38
2004-12-10 09:54
2005.01.09
Excel в Paradox 7