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

При наведении курсора мыши на картинку получить матрицу 8х8 со значениями яркости пикселей

19.10.2012, 10:45. Показов 2765. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Имеется черно-белое изображение, загруженное в программу. Как при наведении курсора мыши в область картинки получить матрицу 8х8 со значениями яркости пикселей? Спасибо! Программа вложена, чтобы было понятно что имеется ввиду. Спасибо большое заранее!
Вложения
Тип файла: rar чб.rar (691.5 Кб, 27 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.10.2012, 10:45
Ответы с готовыми решениями:

При наведении курсора мыши на картинку ее изображение должно меняться на другое
1. По нажатию на кнопку button_1 пользователь получает одно из трех сообщений: "Кликни-ка еще разик", "Эта кнопка — самая...

Как изменить картинку кнопки при наведении на нее курсора мыши?
У меня в кнопке есть картинка,как сделать чтобы она убиралась при наведении на кнопку курсора и вместо неё был красный фон,а потом когда...

При наведении курсора на картинку
Добрый вечер! К сути: Хотелось сделать так, чтобы при наведении курсора на картинку подсвечивался рамкой текст расположенный в другом...

13
35 / 35 / 10
Регистрация: 24.11.2011
Сообщений: 309
19.10.2012, 20:51
Есть же событие MouseMove, через него получаешь координаты пикселя, на который ты указываешь, а там дальше двойным циклом по Х и У уже снимаешь значения яркостей этой матрицы
0
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465
19.10.2012, 22:56  [ТС]
Sor, да, именно этим я и нахожу точку, куда кликается, а как яркость пикселя получить?
0
35 / 35 / 10
Регистрация: 24.11.2011
Сообщений: 309
19.10.2012, 23:57
C++
1
Image1->Canvas->Pixels[x][y]
Добавлено через 18 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int A[8][8];
int Xmm;//допустим эти х и у мы получили из MouseMove
int Ymm;
 
int step1,step2;
step1=-1;
step2=-1;
 
//пусть мы будем получать матрицу 8на8 относительно пикселя с коор 4,4
for (int x = Xmm-4; x <Xmm+4; x++)
{ step1++;
  for (int y= Ymm-4; y < Ymm+4; y++)
        {  step2++;
           A[step2][step1]=Image1->Canvas->Pixels[x][y];
        }
}
 
    for(int i=0;i<8;++i)
    {  // Выводим на экран строку i
       for(int j=0;j<8;++j)
          cout<<A[i][j]<<" ";
       cout<<endl; // Строка завершается символом перехода на новую строку
    }
вот так вот можно
1
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465
20.10.2012, 00:00  [ТС]
Хмм, как вариант) спасибо, завтра попробую сделать подобное) спасибо большое)
0
35 / 35 / 10
Регистрация: 24.11.2011
Сообщений: 309
20.10.2012, 00:03
не за что,
Цитата Сообщение от Sor Посмотреть сообщение
for (int x = Xmm-4; x <Xmm+4; x++) { step1++; for (int y= Ymm-4; y < Ymm+4; y++) { step2++; A[step2][step1]=Image1->Canvas->Pixels[x][y]; } }
тут попроверяй, я на изображении не пробовал просто.
0
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465
20.10.2012, 00:21  [ТС]
Вот тут как раз и выходит ошибка... access violation, в чем проблема?(
0
35 / 35 / 10
Регистрация: 24.11.2011
Сообщений: 309
20.10.2012, 00:33
значит цикл выходит за границы картинки. надо или учесть это, или не тыкать в области около краев))
проверку надо включить просто на выход за пределы
C++
1
2
3
4
if ((y<0)||(y>Image1.height))
 {
   step1++;
 }
и для х
C++
1
2
3
4
if ((x<0)||(y>Image1.Width))
 {
   step2++;
 }
а если не выполняются условия, пусть делает цикл как задуманно
0
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465
20.10.2012, 01:13  [ТС]
В центр даже тыкаешь если, таже ошибка... а эти условия куда вставить?)

Добавлено через 33 минуты
Разобрано, не, значения яркости неадекватны... где может быть ошибка?(
0
35 / 35 / 10
Регистрация: 24.11.2011
Сообщений: 309
20.10.2012, 13:48
покажи полностью, что в итоге
0
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465
20.10.2012, 14:35  [ТС]
Получилось подобное:
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
void __fastcall TForm1::Image2Click(TObject *Sender)
{
  TPoint P;
GetCursorPos(&P);
const int iMouseX = P.x;
const int iMouseY = P.y;
char x[5],y[5],z[10];
strcat (z,x);
strcat (z,y);
Memo1->Lines->Add("X");
Memo1->Lines->Add(iMouseX);
Memo1->Lines->Add("Y");
Memo1->Lines->Add(iMouseY);
Memo1->Lines->Add("Martix:");
 
int A[8][8];
int st1=-1,st2=-1;
for (int xx=iMouseX-4; xx<iMouseX+4;xx++)
{
      //  st1++;
        for (int yy=iMouseY-4; yy<iMouseY+4;yy++)
        {
        //        st2++;
                A[yy-iMouseY][xx-iMouseX]=Image2->Canvas->Pixels[xx][yy];
         //       st2=0;
                }
}
byte r=0;
for (int i=0; i<8; ++i)
for (int j=0;j<8;++j)
{
r=ColorToRGB(A[i][j]);
A[i][j]=r;
Memo1->Lines->Add(A[i][j]);
Memo1->Lines->Add(" ");
}
0
35 / 35 / 10
Регистрация: 24.11.2011
Сообщений: 309
20.10.2012, 14:47
Цитата Сообщение от kristi1 Посмотреть сообщение
A[yy-iMouseY][xx-iMouseX
ну так тут ошибка ведь.
Цитата Сообщение от Sor Посмотреть сообщение
A[step2][step1]=Image1->Canvas->Pixels[x][y];
допустим iMouseY=100 , yy=iMouseY-4=100-4 => получается A[96-100] а такого нету вот и все.
я специально step 1 и step 2 ввел.
а у вас они негде не используются
0
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465
20.10.2012, 14:48  [ТС]
Ну, а при step1 и 2 ошибва access violation идет

Вот полный код программы, может что-то не так? если step2 обнулять воверя, то все хорошо идет, но значения при нажатии в любую область картинки одинаковы... что не так?(

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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
#include "string.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Close ();
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
OpenPictureDialog1->Execute();
Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
}
//---------------------------------------------------------------------------
 
    void SetBitmapPaletteToGreyScale(Graphics::TBitmap *pBitmap)
{
LOGPALETTE *pal;
HPALETTE hpal;
int i;
int PaletteSize; //Size of the palette buffer
pBitmap->PixelFormat = pf8bit;
pal = NULL;
PaletteSize = sizeof(TLogPalette) + (sizeof(TPaletteEntry) * 255);
pal = (LOGPALETTE *) malloc(PaletteSize);
pal->palVersion = 0x300;
pal->palNumEntries = 256;
for (i = 0; i <= 255; i++)
{
  pal->palPalEntry[i].peRed = i;
  pal->palPalEntry[i].peGreen = i;
  pal->palPalEntry[i].peBlue = i;
  pal->palPalEntry[i].peFlags = PC_NOCOLLAPSE;
}
hpal = CreatePalette(pal);
if(hpal != 0) pBitmap->Palette = hpal;
free(pal);
}
 
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  byte r, g, b;
for(int i=0;i<Image1->Height;i++)
{
for(int j=0; j<Image1->Width; j++)
{
int c = ColorToRGB(Image1->Canvas->Pixels[j][i]);
r = c;
g = c >> 8;
b = c >> 16;
int avg = r + g + b;
avg /= 3;
Image2->Canvas->Pixels[j][i] = (TColor)RGB(avg, avg, avg);
}
}
}
//---------------------------------------------------------------------------
 
 
void __fastcall TForm1::Image2Click(TObject *Sender)
{
  TPoint P;
GetCursorPos(&P);
const int iMouseX = P.x;
const int iMouseY = P.y;
char x[5],y[5],z[10];
strcat (z,x);
strcat (z,y);
Memo1->Lines->Add("X");
Memo1->Lines->Add(iMouseX);
Memo1->Lines->Add("Y");
Memo1->Lines->Add(iMouseY);
Memo1->Lines->Add("Martix:");
 
int A[8][8];
int st1=-1,st2=-1;
for (int xx=iMouseX-4; xx<iMouseX+4;xx++)
{
        st1++;
        for (int yy=iMouseY-4; yy<iMouseY+4;yy++)
        {
                st2++;
                A[st2][st1]=Image2->Canvas->Pixels[xx][yy];
                st2=0;
                }
}
byte r=0;
for (int i=0; i<8; ++i)
for (int j=0;j<8;++j)
{
r=ColorToRGB(A[i][j]);
A[i][j]=r;
Memo1->Lines->Add(A[i][j]);
Memo1->Lines->Add(" ");
}
 
}
//---------------------------------------------------------------------------
0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
20.10.2012, 17:02
Если нужно получить часть изображения в массив 8x8, то это делается просто:
C++
1
2
3
4
5
6
7
8
9
10
11
12
const int count = 8;
DWORD A[count][count] = {0}; // TColor A[count][count];
// объявление массива
void __fastcall image1mouseup(TObject*,TMouseButton,TShiftState, int X, int Y)
// получение изображения в массив.
{
    for (int x = 0; x < count; x++)
        for (int y = 0; y < count; y++)
            A[x][y] = Image1->Picture->Bitmap->Canvas->Pixels[X+x][Y+y];
            // если хотите использовать X:Y - как центр,
            // то точки будут [X+x-count/2]:[Y+y-count/2]
}
Так же желательно добавить проверку, чтобы координаты не были больше размера изображения. Будет что-то вроде:
C++
1
if ( ( (X+x) < Image1->Picture->Bitmap->Width) && ( (Y+y) < Image1->Picture->Bitmap->Height) )
Если Вы у вас появится необходимость использовать массивы большего размера, то лучше уже использовать свойство Scanline. Так же, если Вам необходимо скопировать/создать из части изображения - другое, то для этой цели лучше использовать метод CopyRect.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.10.2012, 17:02
Помогаю со студенческими работами здесь

Подсказка при наведении курсора мыши
Смотрю видеоурок, и там переписал вот такой код. Должно при наведении на текст ,как там говорится повится должна подсказка. Вот...

Фокус при наведении курсора мыши
Всем привет! Как реализовать авто-фокус на компонент на который навели курсор? К примеру на форме TListBox и TTrackBar, нужно чтоб при...

При наведении курсора сменить картинку
У меня есть два Image. Предположим, Image1 и Image2. Сами картинки имеют одинаковый размер. Но они находятся в двух разных местах, и Image2...

Изменить картинку при наведении курсора
Здравствуйте! Подскажите пожалуйста, как можно изменить картинку при наведении курсора мыши? В гугле поискал - ничего однозначного не...

При наведении курсора сменить картинку
У меня есть два Image. Предположим, Image1 и Image2. Сами картинки имеют одинаковый размер. Но они находятся в двух разных местах, и Image2...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru