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

Сделать изображение из цветного BMP файла монохромным

05.01.2019, 10:40. Показов 7993. Ответов 18

Студворк — интернет-сервис помощи студентам
Как в С++ при нажатии на кнопку сделать цветную картинку формата bmp монохромной?
Миниатюры
Сделать изображение из цветного BMP файла монохромным  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.01.2019, 10:40
Ответы с готовыми решениями:

Бинаризировать изображение(сделать монохромным)
Вообщем получаю вот так скрин: QPixmap px = QPixmap::grabWindow(QApplication::desktop()->winId()); // получаем картинку Вот так могу...

Изображение BMP-файла
Как попиксельно прочитать изображение BMP-файла т.е. без использования модулей, в частности GraphABC?

Вывести изображение из файла bmp на печать
Спасибо за объяснение, но, если честно, почти именно так я всё и делал. Вот со структурой очень помогли, спасибо! Но осталась одна...

18
place status here
 Аватар для gunslinger
3190 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,023
05.01.2019, 12:31
Пример: Замена цвета пикселей на черно-белый в выбранном окне
Можно еще использовать ScanLine (только используй соответствующее изменение цвета): Фильтр "инверсия цвета"
1
2739 / 1665 / 267
Регистрация: 19.02.2010
Сообщений: 4,406
06.01.2019, 18:15
Muriam, У TBitmap есть поле Monochrome, которое можно переключить в true.
А после - выводить этот TBitmap на экран.
Но операция перевода в монохром - необратимая.
2
0 / 0 / 1
Регистрация: 11.02.2018
Сообщений: 133
07.01.2019, 11:19  [ТС]
VTsaregorodtsev, где расположен компонент Bitmap?
0
Модератор
 Аватар для D1973
9926 / 6463 / 2457
Регистрация: 21.01.2014
Сообщений: 27,417
Записей в блоге: 3
07.01.2019, 12:02
Цитата Сообщение от Muriam Посмотреть сообщение
где расположен компонент Bitmap?
Это не компонент. Это поле свойства Picture компонента Image
C++
1
Image1->Picture->Bitmap->Monochrome = true;
1
0 / 0 / 1
Регистрация: 11.02.2018
Сообщений: 133
07.01.2019, 18:22  [ТС]
D1973, в результате выполнения программы, при нажатии на кнопку, получается квадрат Малевича.

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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
     Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  Image1->Picture->Bitmap->Monochrome = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 
}
//---------------------------------------------------------------------------
Миниатюры
Сделать изображение из цветного BMP файла монохромным  
0
Модератор
 Аватар для D1973
9926 / 6463 / 2457
Регистрация: 21.01.2014
Сообщений: 27,417
Записей в блоге: 3
07.01.2019, 18:37
Хм-м-м... Тут я Вам не подскажу, сам с этим делом не работал никогда, просто ответил, что Bitmap - не компонент...
Но формально - условие соблюдено, картинка одноцветная (монохромная)
1
0 / 0 / 1
Регистрация: 11.02.2018
Сообщений: 133
07.01.2019, 18:46  [ТС]
то же самое с другой картинкой
Миниатюры
Сделать изображение из цветного BMP файла монохромным  
0
place status here
 Аватар для gunslinger
3190 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,023
07.01.2019, 19:38
Лучший ответ Сообщение было отмечено Muriam как решение

Решение

Ссылки из поста №2 я для кого оставлял?
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
  Graphics::TBitmap *Bitmap = new Graphics::TBitmap();
  Bitmap->Assign(Image1->Picture);
 
  Image2->Canvas->FillRect(Image2->Canvas->ClipRect);
 
  if(Bitmap->PixelFormat == pf24bit)
  {
    Byte *ptr, R, G, B, F;
    for(int y = 0; y < Bitmap->Height; y++)
    {
      ptr = (Byte*)Bitmap->ScanLine[y];
      for (int x = 0; x < Bitmap->Width; x++)
      {
        B = *(ptr + x*3);
        G = *(ptr + x*3+1);
        R = *(ptr + x*3+2);
        F = (R + G + B) / 3;
 
        Bitmap->Canvas->Pixels[x][y]=(TColor) RGB(F, F, F);
      }
    }
    Image2->Canvas->Draw(0, 0, Bitmap);
  }
  delete Bitmap;
Миниатюры
Сделать изображение из цветного BMP файла монохромным  
1
place status here
 Аватар для gunslinger
3190 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,023
07.01.2019, 20:09
Еще можно глянуть https://blog.foolsoft.ru/c-per... -monoxrom/
Изменяешь код так (вместо 127 допустимо использовать любое значение от 0 до 255 включительно):
C++
1
2
3
4
        F = (R + G + B) / 3;
        F = F <= 127 ? 0 : 255;
 
        Bitmap->Canvas->Pixels[x][y]=(TColor) RGB(F, F, F);
и получаешь
1
place status here
 Аватар для gunslinger
3190 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,023
07.01.2019, 20:45
В итоге, как вариант, доделать так:
C++
1
2
3
4
5
        F = (R + G + B) / 3;
        if (CheckBox1->Checked)
          F = F <= SpinEdit1->Value ? 0 : 255;
 
        Bitmap->Canvas->Pixels[x][y]=(TColor) RGB(F, F, F);
1
0 / 0 / 1
Регистрация: 11.02.2018
Сообщений: 133
07.01.2019, 21:39  [ТС]
gunslinger, спасибо большое. Поэкспериментирую.

Я немного блондинка. Мне прийдется в этом покопаться. Но я верю в то, что это период становления программистом.

[Удалено]
 Комментарий модератора 
Нарушение п. 4.6 Правил форума
0
0 / 0 / 1
Регистрация: 11.02.2018
Сообщений: 133
16.01.2019, 09:07  [ТС]
gunslinger, этот код работает.

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
  Graphics::TBitmap *Bitmap = new Graphics::TBitmap();
  Bitmap->Assign(Image1->Picture);
 
  Image2->Canvas->FillRect(Image2->Canvas->ClipRect);
 
  if(Bitmap->PixelFormat == pf24bit)
  {
    Byte *ptr, R, G, B, F;
    for(int y = 0; y < Bitmap->Height; y++)
    {
      ptr = (Byte*)Bitmap->ScanLine[y];
      for (int x = 0; x < Bitmap->Width; x++)
      {
        B = *(ptr + x*3);
        G = *(ptr + x*3+1);
        R = *(ptr + x*3+2);
        F = (R + G + B) / 3;
 
        Bitmap->Canvas->Pixels[x][y]=(TColor) RGB(F, F, F);
      }
    }
    Image2->Canvas->Draw(0, 0, Bitmap);
  }
  delete Bitmap;
Только картинка нужна 24 битовая.

А как сделать так, чтобы эта черно-белая картинка сохранялась отдельным файлом, отдельной картинкой?

Есть кусок кода, но он не подходит именно для вашего кода:
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
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    CBmp New;
    FileHeader *fh;
    MAPINFO *mi;
    RGBquad *rgb;
    New.Open("CAT16.BMP");
    fh=New.GetFH();
    mi=New.GetMapInfo();
    rgb=New.GetMap();
    rgb[256].rgbBlue=255;
    rgb[256].rgbGreen=0;
    rgb[256].rgbRed=0;
    int SR;
    for (int i=0;i<256;i++){
        SR=(rgb[i].rgbBlue+rgb[i].rgbGreen+rgb[i].rgbRed)/3;
        //255 оттенков серого
            rgb[i].rgbBlue=SR;
            rgb[i].rgbGreen=SR;
            rgb[i].rgbRed=SR;
    }
    New.Save("CAT16_.BMP");
 
    String str="",temp;
        str=str+"width="+IntToStr(mi->Width)+"\r\n";
        str=str+"heigth="+IntToStr(mi->Height)+"\r\n";
        str=str+"bit="+IntToStr(mi->BitCount)+"\r\n";
        str=str+"Compress="+IntToStr(mi->Compression)+"\r\n";
        str=str+"Size="+IntToStr(mi->Size)+"\r\n";
        Memo1->Lines->Text ="    характеристики";
        Memo1->Lines->Add(str);
        Image1->Picture->LoadFromFile("CAT16_.bmp");
 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Image1->Picture->LoadFromFile("CAT16.bmp");
}
//---------------------------------------------------------------------------
bmp.h
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
79
80
81
82
83
#include <io.h>
#include <stdio.h>
#pragma pack(1)
 
struct FileHeader {
    WORD    bfType; 
    DWORD       bfSize;
    WORD    bfReserved1;    
    WORD    bfReserved2;    
    DWORD       bfOffbits;  
};
struct MAPINFO {
    DWORD Size;         
    DWORD Width;            
          DWORD Height;
    WORD Planes;        
    WORD BitCount;    
    DWORD Compression;    
    DWORD SizeImage;    
    long   XPelsPerMeter;
    long   YPelPerMeter; 
    DWORD ClrUsed;    
    DWORD ClrImportant; 
};
 
struct RGBquad {
    BYTE    rgbBlue;         
    BYTE    rgbGreen;         
    BYTE    rgbRed;         
    BYTE    rgbReserved;    
};
 
class CBmp{
private:
    void *pBmp;
    long SizeFile;
public:
    CBmp();
    ~CBmp();
    void Open(char* fn);
    void Save(char* fn);
    FileHeader *GetFH();
    MAPINFO *GetMapInfo();
    RGBquad *GetMap();
};
void CBmp::Save(char* fn){
        FILE* File;
        File=fopen(fn,"wb");
        fwrite(pBmp,1,SizeFile,File);
        fclose(File);
}
RGBquad *CBmp::GetMap(){
    RGBquad *rgb;
    rgb=(RGBquad *)((long)pBmp+sizeof(FileHeader)+sizeof(MAPINFO));
    return rgb;
}
MAPINFO *CBmp::GetMapInfo(){
    MAPINFO *mi;
    mi=(MAPINFO*)((long)pBmp+sizeof(FileHeader));
    return mi;
}
FileHeader *CBmp::GetFH(){
    FileHeader *fh;
    fh=(FileHeader *)pBmp;
    return  fh;
}
CBmp::CBmp(){
    pBmp=0;
    SizeFile=0;
}
CBmp::~CBmp(){
    delete []pBmp;
}
void CBmp::Open(char* fn){
    FILE* File;
        int hFile;
        File=fopen(fn,"rb");
        hFile=_fileno(File);
        SizeFile=filelength(hFile);
        pBmp=(BYTE*)malloc(SizeFile);
        fread(pBmp,1,SizeFile,File);
        fclose(File);
}
0
 Аватар для TrollHammer
1216 / 709 / 336
Регистрация: 22.02.2018
Сообщений: 2,095
Записей в блоге: 2
16.01.2019, 09:33
Скидываю sample из поставки Builder Tokyo, есть некоторые полезные вещи по обработке изображений
Вложения
Тип файла: zip ImageProc.zip (55.8 Кб, 3 просмотров)
1
0 / 0 / 1
Регистрация: 11.02.2018
Сообщений: 133
16.01.2019, 09:58  [ТС]
пытаюсь так, но не получается

C++
1
Bitmap.SaveToFile("1.bmp");
0
 Аватар для TrollHammer
1216 / 709 / 336
Регистрация: 22.02.2018
Сообщений: 2,095
Записей в блоге: 2
16.01.2019, 10:04
Лучший ответ Сообщение было отмечено Muriam как решение

Решение

А если так?
C++
1
Image1->Picture->SaveToFile("sample.bmp");
Добавлено через 4 минуты
Или
C++
1
   Bitmap->SaveToFile
0
0 / 0 / 1
Регистрация: 11.02.2018
Сообщений: 133
16.01.2019, 10:42  [ТС]
TrollHammer, о, спасибо!!!!

C++
1
Image1->Picture->SaveToFile("sample.bmp");
как раз картинка сохранилась черно-белой отдельным файлом в формате bmp

Добавлено через 33 минуты
TrollHammer,

добавляю такой текст в кнопку, но почему-то происходит ошибка
в компоненте memo чтобы отобразить характеристики

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
/* вывод основных характеристик изображения */
    CBmp New;
    MAPINFO *mi;
    mi=New.GetMapInfo();
 
    String str="",temp;
    str=str+"width="+IntToStr(mi->Width)+"\r\n";
    str=str+"heigth="+IntToStr(mi->Height)+"\r\n";
    str=str+"bit="+IntToStr(mi->BitCount)+"\r\n";
    str=str+"Compress="+IntToStr(mi->Compression)+"\r\n";
    str=str+"Size="+IntToStr(mi->Size)+"\r\n";
    Memo1->Lines->Text = "Характеристики изображения";
    Memo1->Lines->Add(str);
0
0 / 0 / 1
Регистрация: 11.02.2018
Сообщений: 133
16.01.2019, 10:45  [ТС]
программа запускается, но при нажатии на кнопку выходит такая ошибка, см фото
Миниатюры
Сделать изображение из цветного BMP файла монохромным  
0
 Аватар для TrollHammer
1216 / 709 / 336
Регистрация: 22.02.2018
Сообщений: 2,095
Записей в блоге: 2
16.01.2019, 10:47
Тут без отладчика не обойтись
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.01.2019, 10:47
Помогаю со студенческими работами здесь

Работа с BMP-файлами (класс "8 битное BMP изображение)
Написать класс &quot;8 битное BMP изображение&quot;.Класс должен содержать 3 конструктора: конструктор по умолчанию, конструктор с параметрами и...

Dev C++ . Как по пикселям нарисовать изображение из файла .png или .bmp?
Я пишу один проект , в котором использую графику graphics.h Мне нужно вывести в окно моей программы (которую я вызвал с помощью...

Изображение bmp, операция над ним, снова в bmp
Задание состоит в следующем: 1. Перевести изображение в матрицу. 2. Удалить определенные объекты(в матрице). 3. Вывести...

Оставить нужные элементы на изображении,сделать монохромным, получить одномерный массив значений пикселов
Необходимо добавить такой функционал в tcp клиент. Есть цветные изображения 720*480, на них пятна с красноватым оттенком (они нам и...

bmp изображение
Привет всем! Можете подсказать как имея массив с осписением цвета пикселей (RGB) сохранить обратно в изображение формата bmp. Помогите...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита, которое может. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа разработанного в конфигурации КА2. В качестве источника данных указан регистр накопления, в который записываются данные о. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru