0 / 0 / 0
Регистрация: 23.03.2015
Сообщений: 65
1

Как получить заголовок Bitmap и его размер в памяти?!

16.12.2016, 19:00. Показов 1832. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть загруженный битмапа в памяти, они находятся в контексте (DC). Как мне получить заголовок BITMAPINFOHEADER для этого битмап?! Как правильно посчитать размер занимаемый им в памяти?!

Вот приблизительный код, то есть ради примера о битмапах которые создаю и загружаю:
(Внимание код написан только для примера!!)
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
'Первый контекст
Public mDC As Long 
Public mBMP As Long, iBMP As Long 
Public iBG As StdPicture, hBG As Long
'Test - это форма!!!
mDC = CreateCompatibleDC(Test.hdc)
mBMP = CreateCompatibleBitmap(Test.hdc, 3000, 3000)' Необходимо узнать РАЗМЕР а памяти!!!
iBMP = SelectObject(mDC, mBMP)
 
'Второй контекст
Set iBG = LoadPicture(App.Path + "\bg.jpg") ' Необходимо узнать РАЗМЕР в памяти!!!
hBG = CreateCompatibleDC(Test.hdc)
SelectObject hBG, iBG.Handle
'Копирую
BitBlt mDC, 0, 0, 2000, 2000, hBG, 0, 0, SRCCOPY
BitBlt Test.hdc, 0, 0, 1024, 768, mDC, 0, 0, SRCCOPY
Добавлено через 3 минуты
Один битмап создается с помощью CreateCompitableBitmap, а второй грузится через LoadPicture. Мне необходимо посчитать размер для каждого из них. Как правильно это сделать?!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.12.2016, 19:00
Ответы с готовыми решениями:

Получить NSString из JSON и использовать его как заголовок в TableView
у меня в JSON файле есть вот такая строчка "titles of sections": мне нужно поставить каждую...

Swf файл, как получить его реальный размер swfobject
Доброго времени суток. На страничку к себе загрузил swf файл и игрой, и подключил swfobject. ...

Как в lazarus получить размер изображения зная его расположение
Нужно сделать так что бы размеры (height, weight) компонента image соответствовали загружаемому....

Можно ли получить размер загружаемого файла перед тем как скачать его?
Хотя на самом деле мне нужно узнавать, скачался ли файл полностью. и без ошибок или нет. Хотел...

8
Модератор
9722 / 3683 / 871
Регистрация: 22.02.2013
Сообщений: 5,529
Записей в блоге: 78
16.12.2016, 21:19 2
GetObject
0
0 / 0 / 0
Регистрация: 23.03.2015
Сообщений: 65
17.12.2016, 08:21  [ТС] 3
The trick, я нашел другую Апи GetDIBits через нее можно получить заголовок BITMAPINFOHEADER.
Теперь помоги с вопросом, как правильно высчитать размер изображения, вот что я нашел в нете:

Размер = Высота*Ширина*КоличествоБайтНаКаждыйПиксель

То есть bihHeight*biWidth*biBitCount (все переменные из BITMAPINFOHEADER) - правильно ли уравнение?
biBitCount возвращает значение в битах, а надо "БайтНаКаждыйПиксель", значит:
ByteCount=biBitCount/8??
В итоге уравнение: SizeBitmap=bihHeight*biWidth*ByteCount??? Что здесь не правильно???
0
Модератор
9722 / 3683 / 871
Регистрация: 22.02.2013
Сообщений: 5,529
Записей в блоге: 78
17.12.2016, 10:41 4
Там есть поле biSizeImage которое равно размеру битмапа в памяти (если есть компрессия то с компрессией). Если оно равно нулю то в поле bmWidthBytes структуры BITMAP содержится размер в байтах строки развертки, который при умножении на высоту даст нужно количество байтов.
0
0 / 0 / 0
Регистрация: 23.03.2015
Сообщений: 65
17.12.2016, 11:12  [ТС] 5
The trick, я не знаю как получить(объявить я их смогу) эти структуры - BITMAPINFOHEADER и BITMAP, на примере какого нибудь рисунка.
Подскажи как это сделать, а я дальше сам код смогу написать)))

Добавлено через 2 минуты
И еще вопрос:
мое уравнение все таки верно или нет?
ByteCount=biBitCount/8
SizeBitmap=bihHeight*biWidth*ByteCount

Так я тоже получу размер. Интересно просто узнать несколько вариантов)))

Добавлено через 7 минут

Не по теме:

Не по теме:
Как обстоят дела с вбстрит, форум поднимут снова?! Или все безвозратно утеряно?!

0
Модератор
9722 / 3683 / 871
Регистрация: 22.02.2013
Сообщений: 5,529
Записей в блоге: 78
17.12.2016, 17:59 6
Лучший ответ Сообщение было отмечено Don Leno как решение

Решение

Цитата Сообщение от Don Leno Посмотреть сообщение
The trick, я не знаю как получить(объявить я их смогу) эти структуры - BITMAPINFOHEADER и BITMAP, на примере какого нибудь рисунка.
Подскажи как это сделать, а я дальше сам код смогу написать)))
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Option Explicit
 
Private Type BITMAPINFOHEADER
    biSize              As Long
    biWidth             As Long
    biHeight            As Long
    biPlanes            As Integer
    biBitCount          As Integer
    biCompression       As Long
    biSizeImage         As Long
    biXPelsPerMeter     As Long
    biYPelsPerMeter     As Long
    biClrUsed           As Long
    biClrImportant      As Long
End Type
Private Type BITMAP
    bmType              As Long
    bmWidth             As Long
    bmHeight            As Long
    bmWidthBytes        As Long
    bmPlanes            As Integer
    bmBitsPixel         As Integer
    bmBits              As Long
End Type
Private Type DIBSECTION
    dsBm                As BITMAP
    dsBmih              As BITMAPINFOHEADER
    dsBitfields(2)      As Long
    dshSection          As Long
    dsOffset            As Long
End Type
 
Private Declare Function GetObject Lib "gdi32" _
                         Alias "GetObjectA" ( _
                         ByVal hObject As Long, _
                         ByVal nCount As Long, _
                         ByRef lpObject As Any) As Long
 
Private Sub Form_Load()
    Dim tBitmap As BITMAP
    Dim tDib As DIBSECTION
    
    GetObject Picture1.Picture.Handle, Len(tBitmap), tBitmap
    GetObject Picture1.Picture.Handle, Len(tDib), tDib
    
End Sub
Цитата Сообщение от Don Leno Посмотреть сообщение
мое уравнение все таки верно или нет?
Нет, там должно быть выравнивание каждой строки на границу DWORD.

Не по теме:

Цитата Сообщение от Don Leno Посмотреть сообщение
Как обстоят дела с вбстрит, форум поднимут снова?! Или все безвозратно утеряно?!
Хакер постарается восстановить данные по максимуму.

3
0 / 0 / 0
Регистрация: 23.03.2015
Сообщений: 65
17.12.2016, 19:43  [ТС] 7
Вот это да!))) Трик просил лишь кусочек кода, а ты прям готовый исходник выложил)))) Но за это тебе огромное спасибо!!!! Теперь займусь кодингом, а то третий день с места не мог сдвинуться! Как будет что, напишу(но надеюсь терь сам справлюсь )
0
0 / 0 / 0
Регистрация: 23.03.2015
Сообщений: 65
19.12.2016, 18:15  [ТС] 8
SizeOfBMP=tDib.dsBm.bmWidthBytes * tDib.dsBm.bmHeight
0
0 / 0 / 0
Регистрация: 23.03.2015
Сообщений: 65
19.12.2016, 18:18  [ТС] 9
Вот сделал исходник, который показывает размер BMP, созданого с помощью Апи
Вложения
Тип файла: rar ImageSize.rar (2.3 Кб, 12 просмотров)
0
19.12.2016, 18:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.12.2016, 18:18
Помогаю со студенческими работами здесь

Как можно получить при открытии какого-либо медиафайла его размер и изображение?
Добрый всем вечер. Подскажите пожалуйста, как можно вытащить при открытии, какого-либо медиа файла,...

[Brainfuck] Дано число, необходимо получить в памяти его же + его обратную запись
Помогите пожалуйста написать прогу на языке brainfuck: дано число, и необходимо получить в памяти...

Получение фото с веб камеры, занесение его в Bitmap и преобразование Bitmap в массив
В общем необходимо подключиться к веб камере сделать снимок и отправить его в сеть. Задачу я...

Как получить дамп памяти программы, чтоб потом можно было его сохранить и проанализировать?
Ну тут собственно есть нюансы: 1. Как собственно получить сам дамп. То есть это скорее всего...

Создать файл и вывести его размер страницы памяти
Здравствуйте! Помогите с решением такого вопроса по командной строке: создать файл и вывести его...

Сформировать заголовок, отправить его, а затем принять ответный заголовок
День добрый, форумчане. Предо мной задача - сформировать заголовок, отправить его, а затем принять...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru