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

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

05.01.2019, 10:40. Показов 7895. Ответов 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
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,008
05.01.2019, 12:31
Пример: Замена цвета пикселей на черно-белый в выбранном окне
Можно еще использовать ScanLine (только используй соответствующее изменение цвета): Фильтр "инверсия цвета"
1
2622 / 1633 / 266
Регистрация: 19.02.2010
Сообщений: 4,333
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
9907 / 6444 / 2455
Регистрация: 21.01.2014
Сообщений: 27,353
Записей в блоге: 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
9907 / 6444 / 2455
Регистрация: 21.01.2014
Сообщений: 27,353
Записей в блоге: 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
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,008
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
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,008
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
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,008
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
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru