Форум: "Media";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "Media";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.033 c