Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.91/47: Рейтинг темы: голосов - 47, средняя оценка - 4.91
7 / 7 / 1
Регистрация: 16.01.2012
Сообщений: 95
1

Нарисовать полупрозрачный прямоугольник на Bitmap или Image

23.04.2012, 20:50. Показов 8934. Ответов 21
Метки нет (Все метки)

Привет всем.
Встала проблемка - надо на картинке нарисовать полупрозрачный прямоугольник.
Canvas->FillRect да рисует, но хотелось бы полупрозрачный прямоугольник получить.
Думаю надо копать в сторону
C++
1
2
3
4
5
6
BOOL AlphaBlend(HDC hdcDesk, int nXOriginDest,int nYOriginDesk,
 
                               int nWidthDest, int nHeightDest,
                               HDC hdcSrc, int nXOriginSrc int nYOriginSrc,
                               int nWidthSrc, int nHeightSrc,
                               BLENDFUNCTION blendFDunction);
но только пока не понял как. Если кто занимался, киньте примерчик плиз.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.04.2012, 20:50
Ответы с готовыми решениями:

Как обрезать Image (bitmap) в другой Image (bitmap)
Не получается никак пробовал с помощью Canvas->CopyRect. Вот метод где первый параметр...

Полупрозрачный Image
Как сделать полупрозрачным только Image?

Нарисовать прямоугольник и при нажатии клавиш необходимо переместить влево, вправо, вверх или вниз
Найдите,пожалуйста, ошибки в данном коде: ...

Как нарисовать Bitmap на Bitmap?
Bitmap1->Canvas->Draw(1,1,Bitmap2); Так не работает, хотя с Image проходило.

21
Эксперт С++
8297 / 6128 / 613
Регистрация: 10.12.2010
Сообщений: 28,659
Записей в блоге: 30
23.04.2012, 21:30 2
Есть такой пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Graphics::TBitmap *bmp;
bmp =new Graphics::TBitmap;
bmp->LoadFromFile("1.bmp");
 
BLENDFUNCTION bf; // структура
bf.BlendOp = AC_SRC_OVER;
bf.BlendFlags = 0;
bf.SourceConstantAlpha = 50; //величина прозрачности (0-255)
bf.AlphaFormat = 0;
::AlphaBlend(Image1->Canvas->Handle, 0, 0,
                    Image1->ClientWidth,
                    Image1->ClientHeight,
                    bmp->Canvas->Handle, 0, 0,
                    bmp->Width,
                    bmp->Height, bf);
delete bmp;
bmp = NULL;
 
}
Вложения
Тип файла: rar Полупрозрачность.rar (294.3 Кб, 98 просмотров)
0
7 / 7 / 1
Регистрация: 16.01.2012
Сообщений: 95
23.04.2012, 21:36  [ТС] 3
да я понял, спасибо, тогда придется на основной Bitmap наложить еще один полупрозрачный в виде прямоугольника и из них сваять третий итоговый. Тогда вопрос, а как слить два битмапа в один?
0
Эксперт С++
8297 / 6128 / 613
Регистрация: 10.12.2010
Сообщений: 28,659
Записей в блоге: 30
23.04.2012, 21:55 4
Если не изменяет память, то копированием, но при этом надо выбрать соответствующий мод
C++
1
Canvas->CopyMode
0
7 / 7 / 1
Регистрация: 16.01.2012
Сообщений: 95
23.04.2012, 22:05  [ТС] 5
не просто интересно, что никто не занимался данной проблемой?
просто на шарпе все просто
C#
1
2
3
4
5
6
7
8
9
        //-----------------------------------------
        public void SetRectangleFromImage(Image ImageSource, Color BackColor, int Transparent, int XBegin, int YBegin, int Width, int Height)
        {
            using(Graphics graphics = Graphics.FromImage(ImageSource))
            using (Brush brush = new SolidBrush(Color.FromArgb(Transparent, BackColor)))
            {
                graphics.FillRectangle(brush, XBegin, YBegin, Width, Height);
            }
        }
и без проблем, а вот на бормане приходится извращаться
0
Эксперт С++
8297 / 6128 / 613
Регистрация: 10.12.2010
Сообщений: 28,659
Записей в блоге: 30
23.04.2012, 22:18 6
Честно говоря я не понимаю как должен выглядеть конечный результат
0
7 / 7 / 1
Регистрация: 16.01.2012
Сообщений: 95
23.04.2012, 22:19  [ТС] 7
такое чувство что на форуме мы с Вами одни
0
7 / 7 / 1
Регистрация: 16.01.2012
Сообщений: 95
23.04.2012, 22:26  [ТС] 8
вот так, сразу говорю, это написано на шарпе, просто надо переложить на builder
Миниатюры
Нарисовать полупрозрачный прямоугольник на Bitmap или Image  
0
Эксперт С++
8297 / 6128 / 613
Регистрация: 10.12.2010
Сообщений: 28,659
Записей в блоге: 30
23.04.2012, 22:36 9
Полупрозрачный прямоугольник это тот на котором дата?
0
7 / 7 / 1
Регистрация: 16.01.2012
Сообщений: 95
23.04.2012, 22:40  [ТС] 10
Ну да прозрачность задается при вызове
C#
1
2
SetRectangleFromImage(SourceImage, Color.Black, 150 , 0, SourceImage.Height - 30, SourceImage.Width, 25);
                                               // 150 - вот степень прозрачности
Просто написал на шарпе, а шеф , блин консервативен ему Builder подавай. Вот и перекладываю.
В принципе все сделал, но вот уперся в этот полупрозрачный прямоугольник.
0
Эксперт С++
8297 / 6128 / 613
Регистрация: 10.12.2010
Сообщений: 28,659
Записей в блоге: 30
23.04.2012, 22:43 11
Ну да, для C# FrameWork нужен без него же прога не пойдет, кажется?
1
7 / 7 / 1
Регистрация: 16.01.2012
Сообщений: 95
23.04.2012, 22:49  [ТС] 12
Да у нас семерка винда стоит везде а там уже FrameWork 3.5 стоит по умолчанию, да и побликацию можно сделать, она сразу поставит framework 4.0. Просто я один кто может писать на шарпе, остальные на билдере сидят. Вот и приходится перекладывать, а билдер я забросил пол года назад, вот возвращаюсь. Блин как же создать этот прямоугольник. В него уперлось все.
ЗЫ: создал класс TThread для скриншота, падает все равно но это пока не критично.
0
Эксперт С++
8297 / 6128 / 613
Регистрация: 10.12.2010
Сообщений: 28,659
Записей в блоге: 30
23.04.2012, 23:50 13
Вот что нашел
Canvas Blend
http://www.comprice.ru/article... print=true
0
Эксперт С++
8297 / 6128 / 613
Регистрация: 10.12.2010
Сообщений: 28,659
Записей в блоге: 30
24.04.2012, 02:32 14
Вот что получилось если попиксельно преобразовывать
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
//---------------------------------------------------------------------------
int k=0;
 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Image1->Stretch=true;
Image1->Proportional=true;
Image1->Picture->LoadFromFile("2.bmp");
Image2->Stretch=true;
Image2->Proportional=true;
Image2->Picture->LoadFromFile("2.bmp");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//k=-255/2;
int w= Image1->Picture->Bitmap->Width;
int h= Image1->Picture->Bitmap->Height;
for(int x=0;x<w;x++)
  for(int y=20;y<70;y++)
  {
  int p=Image1->Canvas->Pixels[x][y];
  int b= (GetBValue(p)+k<255)?(GetBValue(p)+k):255;
  int r= (GetRValue(p)+k<255)?(GetRValue(p)+k):255;
  int g= (GetGValue(p)+k<255)?(GetGValue(p)+k):255;
 
  if(b<0) b=0; if(g<0) g=0; if(r<0) r=0;
 
  Image2->Picture->Bitmap->Canvas->Pixels[x][y] = (TColor)RGB(r,g,b);//рисуем
  }
Image2->Repaint();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
k=   TrackBar1->Position;
}
//---------------------------------------------------------------------------
Миниатюры
Нарисовать полупрозрачный прямоугольник на Bitmap или Image  
0
871 / 447 / 35
Регистрация: 25.10.2011
Сообщений: 910
24.04.2012, 12:47 15
А функцию AlphaBlend не пробовали использовать?
0
Эксперт С++
8297 / 6128 / 613
Регистрация: 10.12.2010
Сообщений: 28,659
Записей в блоге: 30
24.04.2012, 18:12 17
DefineTrueFalse, ну лично я как то не особо понимаю как она работает.
Да и поидее,как я себе это представляю, это будет сложнее
1. Создать Bitmap с черным цветом
2. С помощью AlphaBlend установить прозрачность ( то есть как я понимаю увеличить яркость, т.е сделать серой )
3. Загрузить картинку в Image и сложить ее с Bitmap

LK,я уже эту ссылку приводил
0
Практикантроп
4703 / 2614 / 506
Регистрация: 23.09.2011
Сообщений: 5,629
24.04.2012, 18:40 18
- может быть мой "примитив" Вам пригодится...
Миниатюры
Нарисовать полупрозрачный прямоугольник на Bitmap или Image  
Вложения
Тип файла: rar Trasparency.rar (588.4 Кб, 129 просмотров)
1
871 / 447 / 35
Регистрация: 25.10.2011
Сообщений: 910
24.04.2012, 19:50 19
В статье приведенной LK, описывается работа с этой функцией. Но если в кратце, для реализации описанного вами пункта можно создать функцию вроде этой:
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
//------------------------------------------------------------------------------
#define SelectObjectF(MAIN,SUBOBJECT) HGDIOBJ hRe##SUBOBJECT = ::SelectObject(MAIN,SUBOBJECT)
#define SelectObjectE(MAIN,SUBOBJECT) ::SelectObject(MAIN,hRe##SUBOBJECT)
// аналог подобных макросов желательно иметь под рукой, если с WinAPI работаете.
//------------------------------------------------------------------------------
void __fastcall FiilRectAlpha(HDC hDestination, TRect Rect, COLORREF AlphaColor, BYTE AlphaValue)
// процедура по добавлению к графическому дескриптору (hDestination) "полу-прозрачной" области (Rect)
// с заданным цветом (AlphaColor) и уровнем прозрачности (AlphaValue)
{
    HBITMAP hAlphaBitmap = ::CreateCompatibleBitmap(hDestination, 1, 1);
    // создаем изображение в памяти с совметимыми параметрами, размером 1х1
    HDC hAlphaDevice = ::CreateCompatibleDC(hDestination);
    // создаем совместимый графический дескриптор в памяти.
    SelectObjectF(hAlphaDevice, hAlphaBitmap);
    // объединяем их.
    ::SetPixelV(hAlphaDevice, 0, 0, AlphaColor);
    // заливаем область заданным цветом.
    
    BLENDFUNCTION hAlphaBlend;
    memset(&hAlphaBlend, NULL, sizeof(BLENDFUNCTION));
    hAlphaBlend.SourceconstantAlpha = AlphaValue;
    // создаем пустое описание для функции, но указываем уровень заливки (0-255).
    
    ::AlphaBlend(hDestination,Rect.Left,Rect.Top,Rect.Right,Rect.Bottom,
        hAlphaDevice, 0, 0, 1, 1, hAplhaBlend);
    // используем функцию с заданными параметрами.
    
    SelectObjectE(hAlphaDevice,hAlphaBitmap);
    // разделяем объекты (если этого возможна будет утечка памяти).
    ::DeleteDC(hAlphaDevice);
    ::DeleteObject(hAlphaBitmap);
    // удаляем созданные в памяти объекты.
}
//------------------------------------------------------------------------------
За корректность не ручаюсь, написано "на ходу".
1
7 / 7 / 1
Регистрация: 16.01.2012
Сообщений: 95
25.04.2012, 19:43  [ТС] 20
Да попробовал работает. Спасибо

Добавлено через 9 часов 26 минут
Доброго времени Вам.
Еще один вопросик, возник...
Короче есть клиент он:
1. Делает скриншот экрана.
2. Добавляет полупрозрачный прямоугольник, по методу, предложенным DefineTrueFalse
3. Пишет на этом прямоугольнике надпись, при помощи Canvas->TextOutA
4. Пакует Bitmap -> JPEG
5. Шлет серваку

Все вроде хорошо на сервере, картинка есть прямоугольник есть, надпись есть, но при попытке
совершить действие над формой клиента типа, мышкой повозить/нажать, изменить размер и т.п.
Надпись и прямоугольник пропадают на время (буквально 0.5 сек) потом все ок. Хотя сам скриншот остается. Пробовал передовать сигнал с камеры поставил перед ней маячить метроном в ускоренном режиме, тоже самое. Картинка есть, без задержек, а надпись и прямоугольник иногда пропадают
Если форму клиента не трогать, сложить в трей или закрыть другим приложением все ок.
Че ни так?

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

Добавлено через 53 секунды
Все делается клиентом в отдельной нитке
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.04.2012, 19:43

Нарисовать прямоугольник поверх background image
Доброго времени суток! Как нарисовать прямоугольник по верх BackGroundImage. Пробовал: ...

Нарисовать прямоугольник (ROI) на Image (MVVM)
День добрый, подскажите, как по пользовательским щелкам мышки по Image нарисовать на изображении...

Как нарисовать Bitmap в конкретной точке на контроле Image ?
Привет ! У меня есть 9 небольших Bitmap'ов, мне нужно их нарисовать в определенных точках, на...

"наложить" поверх экрана (или только на форму) полупрозрачный проницаемый прямоугольник
Возможно ли средствами C# &quot;наложить&quot; поверх экрана (или только на форму) полупрозрачный проницаемый...


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

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

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