Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-1103795423
TUser
2004-12-23 12:50
2005.01.09
Как может оптимизатор пропускать такое?


14-1103203292
Игорь Шевченко
2004-12-16 16:21
2005.01.09
Министр обороны призвал "прекратить дебилизацию" россиян


3-1102488768
denis24
2004-12-08 09:52
2005.01.09
Работа с AdoQuery в отдельном потоке


1-1103742624
Capital
2004-12-22 22:10
2005.01.09
Своя область на контрол-панэл


14-1103510809
Думкин
2004-12-20 05:46
2005.01.09
С днем рождения! 20 декабря





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский