Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/37: Рейтинг темы: голосов - 37, средняя оценка - 4.86
1 / 1 / 0
Регистрация: 11.04.2009
Сообщений: 13

Чтение заголовка bmp и перевод изображения в серые тона

11.04.2009, 09:41. Показов 7734. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Продлема состоит следующем:
1. Есть изоброжение в формате bmp, нужно вывести в Memo название каждого поля заголовка файла, заголовка BITMAP и значение каждого поля..... в структуре заголовка я немного разобралась, но как в Buildere 6 достучаться до заголовка изображения, открытого следующим образом:

C++
1
2
3
4
5
   if (OPD1->Execute())
   {
        Edit1->Text = OPD1->FileName;
        Image1->Picture->LoadFromFile(OPD1->FileName);
   }
.... понимаю, что это должно быть просто, но вот уже 3 дня ничего не получается ((

2. после этого изображение нужно перевести из цветного формата в картинку с оттенками серого (есть пример, как это делается на Visual C++, но как это сделать в Buildere, я не знаю, а если точнее, то не получается):
вот этот код на Visual C++:

C++
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
BOOL GrayScale(HDC hDC, LPRECT pRC, HWND hWndCallback)//HDC hDC - что это и откуда это нужно брать?
{
    BITMAPINFO BMI = { 0 };
    HDC hTmpDC; 
    HBITMAP hOldBitmap, hTmpBitmap;
    ULONG lBytesCnt;
    LPBYTE pPixels;
    LONG i, j, lColor, lR, lG, lB, lS;
 
    volatile ONPROGRESSPARAMS ONPP = { 0 };
 
    USHORT BPP = GetDeviceCaps(hDC, BITSPIXEL);// тоже не понятно, что здесь делается (msdn есть, но с английский у меня проблема, не могу разобраться... и т.д.)
 
    if ((BPP != 24) && (BPP != 32)) return FALSE;
    if (GetObjectType(hDC) != OBJ_DC) return FALSE;
 
    LONG W = GetDeviceCaps(hDC, HORZRES);
    LONG H = GetDeviceCaps(hDC, VERTRES);
 
    switch (BPP)
    {
        case 24:
            lBytesCnt = (((BPP / 8) * W + 3) / 4) * 4;
            lBytesCnt += ((lBytesCnt * H + 3) / 4) * 4;
            break;
        case 32:
            lBytesCnt = W * H * (BPP / 8);
            break;
    }
 
    pPixels = new BYTE[lBytesCnt];
 
    hTmpDC = CreateCompatibleDC(hDC);
    hTmpBitmap = CreateCompatibleBitmap(hDC, W, H);
    hOldBitmap = (HBITMAP)SelectObject(hTmpDC, hTmpBitmap);
    BitBlt(hTmpDC, 0, 0, W, H, hDC, 0, 0, SRCCOPY);
 
    BMI.bmiHeader.biSize = sizeof(BMI.bmiHeader);
    BMI.bmiHeader.biWidth = W;
    BMI.bmiHeader.biHeight = H;
    BMI.bmiHeader.biPlanes = 1;
    BMI.bmiHeader.biBitCount = BPP;
    BMI.bmiHeader.biCompression = BI_RGB;
    GetDIBits(hTmpDC, hTmpBitmap, 0, H, pPixels, &BMI, DIB_RGB_COLORS);
 
    for (j = pRC->top; j < pRC->bottom; j++)
    {
        for (i = pRC->left; i < pRC->right; i++)
        {
            lColor = GetPixel(pPixels, &BMI, i, j);
 
            //BGR -> RGB
            lR = R_BGR(lColor);
            lG = G_BGR(lColor);
            lB = B_BGR(lColor);
 
            lS = (LONG)(lR * 0.299 + lG * 0.587 + lB * 0.114);
 
            //SSS -> BGR
            SetPixel(pPixels, &BMI, i, j, BGR(lS, lS, lS));
        }
        if (hWndCallback)
        {
            ONPP.dwPercents = (DWORD)(((double)j / (double)pRC->bottom) * 100);
            SendMessage(hWndCallback, WM_GRAPHICSEVENT, MAKEWPARAM(EVENT_ON_PROGRESS, 0),
                (LPARAM)&ONPP);
        }
    }
 
    StretchDIBits(hDC, 0, 0, W, H, 0, 0, W, H, pPixels, &BMI,
        DIB_RGB_COLORS, SRCCOPY);
 
    SelectObject(hTmpDC, hOldBitmap);
    DeleteObject(hTmpBitmap);
    DeleteDC(hTmpDC);
    delete[] pPixels;
    return TRUE;
}

Помогите переделать этот код так, чтобы он заработал в buildere 6...... нужно очень срочно
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.04.2009, 09:41
Ответы с готовыми решениями:

Изменение цвета изображения, из RGB в серые тона
есть вопрос: как из этого кода, сделать адекватное изменение цвета изображения на черно белое(градации серого)Помогите,плиз Bitmap^...

Чтение заголовка BMP
Есть след код, который должен читать заголовок BMP Но он его читаеть криво (пропускает 2 байта) Ктонить может помочь решить эту...

Чтение заголовка bmp файла
Написать программу, которая позволяет ввести имя bmp-файла, считать его заголовки и вывести на консоль информацию о размере файла, ширине...

16
 Аватар для mirso
562 / 373 / 55
Регистрация: 05.04.2009
Сообщений: 767
11.04.2009, 20:19
C++
1
2
My_picture->LoadFromFile("Point_drawing.bmp");
    My_picture->Monochrome = true;
0
1 / 1 / 0
Регистрация: 11.04.2009
Сообщений: 13
12.04.2009, 00:04  [ТС]
mirso, а как теперь это изображение загрузить в Image, чтоб посмотреть результат?
Пробую так:
C++
1
2
3
4
5
6
7
        Graphics::TBitmap* bmp1;// так определен bmp1
        
         ...
  
        bmp1->LoadFromFile(Edit1->Text);
        bmp1->Monochrome = true;
        Image2->Picture = bmp1;
Выдает ошибку: E2034 Cannot convert 'TBitmap *' to 'TPicture *'
Подскажи, что не так.
0
 Аватар для mirso
562 / 373 / 55
Регистрация: 05.04.2009
Сообщений: 767
12.04.2009, 01:15
Прежде чем загружать, желательно определиться с пропорциональностью и автоматическим масштабированием.
C++
1
2
3
4
5
6
7
8
9
Graphics::TBitmap *bmp1;// так определен bmp1
 
        bmp1 = new Graphics::TBitmap();
        bmp1->LoadFromFile("Point_drawing.bmp");
        bmp1->Monochrome = true;
        Image1->Picture->Assign(bmp1);
 
 
 bmp1->Graphics::~TBitmap();
0
1 / 1 / 0
Регистрация: 11.04.2009
Сообщений: 13
12.04.2009, 02:08  [ТС]
mirso, результатом является черный квадрат, приведенный код - он не переводит рисунок в серые тона, просто закркшивает все черным (((
0
 Аватар для mirso
562 / 373 / 55
Регистрация: 05.04.2009
Сообщений: 767
12.04.2009, 02:55
У меня нормаль.
Результат такой словно в Paint
выбрали опцию сохранения
монохром.

Добавлено через 1 минуту 52 секунды
попробуй смени картинку

Добавлено через 24 минуты 20 секунд
Можно пойти путем попроще - 0,618(золотое сечение
Меньшее настолько меньше большего,
насколько большее меньше их суммы)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Graphics::TBitmap *bmp1;// так определен bmp1
 
        bmp1 = new Graphics::TBitmap();
        bmp1->LoadFromFile("Point_drawing.bmp");
        bmp1->PixelFormat = pf24bit; //
 
    for(int i = 0; i < bmp1->Width; i++)
    {
      for(int j=0; j < bmp1->Height; j++)
      {
        TColor PixColor = bmp1->Canvas->Pixels[i][j];
        byte GrayC = ((0.382 * GetRValue(PixColor)) +
                      (0.618 * GetGValue(PixColor)) +
                      (0.236 * GetBValue(PixColor )));
         bmp1->Canvas->Pixels[i][j]=RGB(GrayC,GrayC,GrayC);
      }
    }
 
    Image1->Picture->Assign(bmp1);
    bmp1->Graphics::~TBitmap();
1
1 / 1 / 0
Регистрация: 11.04.2009
Сообщений: 13
12.04.2009, 02:59  [ТС]
Результат таков: Если брать цветную картинук на каком либо фоне (синий, красный, бежевый), то получается черный квадрат, а если брать изображения с оттенками серого без фона, то рисунок получается черно белый, вот

C++
1
2
3
4
5
TColor PixColor = bmp1->Canvas->Pixels[i][j];
        byte GrayC = ((0.382 * GetRValue(PixColor)) +
                      (0.618 * GetGValue(PixColor)) +
                      (0.236 * GetBValue(PixColor )));
         bmp1->Canvas->Pixels[i][j]=RGB(GrayC,GrayC,GrayC);
Это дало только то, что рисуно получился не черно белый, черно-серый: рисунок черный, а фон серый, но опять же, если картинка цветная, то получается черный квадрат
0
 Аватар для mirso
562 / 373 / 55
Регистрация: 05.04.2009
Сообщений: 767
12.04.2009, 03:08
фото
Миниатюры
Чтение заголовка bmp и перевод изображения в серые тона  
0
1 / 1 / 0
Регистрация: 11.04.2009
Сообщений: 13
12.04.2009, 03:21  [ТС]
Результат такой:
Изображения
 
0
1 / 1 / 0
Регистрация: 11.04.2009
Сообщений: 13
12.04.2009, 03:25  [ТС]
Кстати, при замене коэффициентов на такие:
C++
1
2
3
byte GrayC = ((0.299 * GetRValue(PixColor)) +
                      (0.587 * GetGValue(PixColor)) +
                      (0.114 * GetBValue(PixColor )));
в первом случае серый фон изчезает, но с цветными картинками все по прежнему (
0
 Аватар для mirso
562 / 373 / 55
Регистрация: 05.04.2009
Сообщений: 767
12.04.2009, 03:34
у меня с твоим изображением чей-то ваще глючит
А с моими все работает!
Миниатюры
Чтение заголовка bmp и перевод изображения в серые тона   Чтение заголовка bmp и перевод изображения в серые тона  
0
1 / 1 / 0
Регистрация: 11.04.2009
Сообщений: 13
12.04.2009, 03:45  [ТС]
У меня с твоими изображениями тоже не работает ((((
0
 Аватар для mirso
562 / 373 / 55
Регистрация: 05.04.2009
Сообщений: 767
12.04.2009, 06:59
Интернет заглючил, подключился телефоном.

Работает медленно, но уверенно.
C++
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
Graphics::TBitmap *bmp1 = new Graphics::TBitmap();
 
    bmp1->LoadFromFile("Point_drawing.bmp");
 
Image1->Picture->Assign(bmp1);
 
    bmp1->PixelFormat = pf24bit;
 
    int PixCol;
    for(int x = 0; x < bmp1->Width; x++)
    {
      for(int y = 0; y < bmp1->Height; y++)
      {
         PixCol = GetRValue(bmp1->Canvas->Pixels[x][y]) +
                  GetGValue(bmp1->Canvas->Pixels[x][y]) +
                  GetBValue(bmp1->Canvas->Pixels[x][y]);
         PixCol /= 3;
         //PixCol *= 0.618;
         //для изменения яркости от 0 до 1 PixCol = Edit->Text; можно и Timer
 
 
         bmp1->Canvas->Pixels[x][y]=(TColor)RGB(PixCol, PixCol, PixCol);
      }
    }
//////////////////////////////////////////
//                                      //
//           |^^^пиво^^||""\_,_         //
//           |___________||__|__|)      //
//           (@)(@)""*|(@)(@)**(@)      //
//                                      //
//////////////////////////////////////////
 
Image2->Picture->Assign(bmp1);
    bmp1->Graphics::~TBitmap();
Изображение выходит четким
Можно конечно прибамбасов наделать,
таймер подключить и менять яркость!
Можно с помощью UpDown.
Это вроде бы должно работать у всех.

.
Миниатюры
Чтение заголовка bmp и перевод изображения в серые тона  
2
1 / 1 / 0
Регистрация: 11.04.2009
Сообщений: 13
12.04.2009, 16:56  [ТС]
mirso, спасибо, заработало.... я ж просто забыла убрать
C++
1
bmp1->Monochrome = true;
.... после того как убрала, заработал и предыдущий вариант ))
А скажи пожалуйста, ты не работал со структурами: BITMAPFILEHEADER и BITMAPINFOHEADER.
Объявляю переменные:
C++
1
2
 BITMAPINFOHEADER bmih;
 BITMAPFILEHEADER bmfh;
как обращаться к полям структуры понятно
C++
1
bmih.biWidth;
но как связать эти структуры с имеющимся изображением:
1.
C++
1
Graphics::TBitmap *bmp1 = new Graphics::TBitmap();
или
2.
C++
1
Image1->Picture->LoadFromFile(OPD1->FileName);
не могу понять ((
0
 Аватар для mirso
562 / 373 / 55
Регистрация: 05.04.2009
Сообщений: 767
12.04.2009, 19:21
Просто забыла - пол взвода расстреляли!
Важно не забыть создать условие выхода из цикла с удалением программ.

BITMAPFILEHEADER bfType bfSize bfReserved1 bfReserved2 bfOffBits; не использовал,
а цель какая?
Вообще-то усложнять жизнь - просто!!!
0
1 / 1 / 0
Регистрация: 11.04.2009
Сообщений: 13
12.04.2009, 20:33  [ТС]
Нужно, чтобы там хранились данные о изображении, а потом эти жанные нужно вывести в Memo. Вот )
0
 Аватар для mirso
562 / 373 / 55
Регистрация: 05.04.2009
Сообщений: 767
12.04.2009, 21:00
Если типа
C++
1
2
3
4
5
6
7
for(int n; n < DlinaStenu; n++)
    {
        Memo1->Lines->AddObject(text[n], bmp[n]);
    }
 
    delete [] tex;
    delete [] bmp;
то, я считаю - париться не стоит.

Добавлено через 2 минуты 2 секунды
n - изначально по усмотрению.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.04.2009, 21:00
Помогаю со студенческими работами здесь

Изменение тона изображения
Доброго времени суток. Есть такая проблема: дано: компонент TImage; нужно изменить тон изображения. Я закинул на форму три...

Чтение заголовка PE
День добрый всем. В качестве хобби решил поковыряться с PE-файлами, используя Qt. Хочу сделать отображение структуры выбранного файла. ...

Чтение Wav заголовка!
Здравствуйте, я сегодня хотел спросить, как прочитать заголовок WAV файла в vb 6.0. Заранее спасибо! P.S Желательно с пояснениями...

Чтение заголовка из файла
Здравствуйте, уважаемые программисты! Некоторое время назад тоже решил заняться изучением PHP. Изучаю по книге &quot;PHP 7 в...

Чтение заголовка PSD файла
Нужно считать заголовок PSD-файла. Написал такой код, в учебной методичке приведены значения, которые должны быть. Но у меня, само собой,...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru