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

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

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

Author24 — интернет-сервис помощи студентам
Как в С++ при нажатии на кнопку сделать цветную картинку формата bmp монохромной?
Миниатюры
Сделать изображение из цветного BMP файла монохромным  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.01.2019, 10:40
Ответы с готовыми решениями:

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

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

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

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

18
случайный прохожий
2927 / 1944 / 606
Регистрация: 20.07.2013
Сообщений: 5,144
05.01.2019, 12:31 2
Пример: Замена цвета пикселей на черно-белый в выбранном окне
Можно еще использовать ScanLine (только используй соответствующее изменение цвета): Фильтр "инверсия цвета"
1
1486 / 1413 / 240
Регистрация: 19.02.2010
Сообщений: 3,914
06.01.2019, 18:15 3
Muriam, У TBitmap есть поле Monochrome, которое можно переключить в true.
А после - выводить этот TBitmap на экран.
Но операция перевода в монохром - необратимая.
2
0 / 0 / 1
Регистрация: 11.02.2018
Сообщений: 133
07.01.2019, 11:19  [ТС] 4
VTsaregorodtsev, где расположен компонент Bitmap?
0
Модератор
9246 / 6027 / 2376
Регистрация: 21.01.2014
Сообщений: 25,771
Записей в блоге: 3
07.01.2019, 12:02 5
Цитата Сообщение от Muriam Посмотреть сообщение
где расположен компонент Bitmap?
Это не компонент. Это поле свойства Picture компонента Image
C++
1
Image1->Picture->Bitmap->Monochrome = true;
1
0 / 0 / 1
Регистрация: 11.02.2018
Сообщений: 133
07.01.2019, 18:22  [ТС] 6
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
Модератор
9246 / 6027 / 2376
Регистрация: 21.01.2014
Сообщений: 25,771
Записей в блоге: 3
07.01.2019, 18:37 7
Хм-м-м... Тут я Вам не подскажу, сам с этим делом не работал никогда, просто ответил, что Bitmap - не компонент...
Но формально - условие соблюдено, картинка одноцветная (монохромная)
1
0 / 0 / 1
Регистрация: 11.02.2018
Сообщений: 133
07.01.2019, 18:46  [ТС] 8
то же самое с другой картинкой
Миниатюры
Сделать изображение из цветного BMP файла монохромным  
0
случайный прохожий
2927 / 1944 / 606
Регистрация: 20.07.2013
Сообщений: 5,144
07.01.2019, 19:38 9
Лучший ответ Сообщение было отмечено 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
случайный прохожий
2927 / 1944 / 606
Регистрация: 20.07.2013
Сообщений: 5,144
07.01.2019, 20:09 10
Еще можно глянуть 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);
и получаешь
Сделать изображение из цветного BMP файла монохромным
1
случайный прохожий
2927 / 1944 / 606
Регистрация: 20.07.2013
Сообщений: 5,144
07.01.2019, 20:45 11
В итоге, как вариант, доделать так:
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);
Сделать изображение из цветного BMP файла монохромным
1
0 / 0 / 1
Регистрация: 11.02.2018
Сообщений: 133
07.01.2019, 21:39  [ТС] 12
gunslinger, спасибо большое. Поэкспериментирую.

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

[Удалено]
 Комментарий модератора 
Нарушение п. 4.6 Правил форума
0
0 / 0 / 1
Регистрация: 11.02.2018
Сообщений: 133
16.01.2019, 09:07  [ТС] 13
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
1212 / 706 / 335
Регистрация: 22.02.2018
Сообщений: 2,059
Записей в блоге: 2
16.01.2019, 09:33 14
Скидываю sample из поставки Builder Tokyo, есть некоторые полезные вещи по обработке изображений
Вложения
Тип файла: zip ImageProc.zip (55.8 Кб, 3 просмотров)
1
0 / 0 / 1
Регистрация: 11.02.2018
Сообщений: 133
16.01.2019, 09:58  [ТС] 15
пытаюсь так, но не получается

C++
1
Bitmap.SaveToFile("1.bmp");
0
1212 / 706 / 335
Регистрация: 22.02.2018
Сообщений: 2,059
Записей в блоге: 2
16.01.2019, 10:04 16
Лучший ответ Сообщение было отмечено 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  [ТС] 17
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  [ТС] 18
программа запускается, но при нажатии на кнопку выходит такая ошибка, см фото
Миниатюры
Сделать изображение из цветного BMP файла монохромным  
0
1212 / 706 / 335
Регистрация: 22.02.2018
Сообщений: 2,059
Записей в блоге: 2
16.01.2019, 10:47 19
Тут без отладчика не обойтись
0
16.01.2019, 10:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.01.2019, 10:47
Помогаю со студенческими работами здесь

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

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

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

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


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

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