Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 1
Регистрация: 17.09.2014
Сообщений: 46

Неверное чтение уровней пикселей

04.12.2014, 14:51. Показов 1695. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создал форму, в ней бокс. В него гружу рисунок, в котором первую строку предварительно подготовил в Фотошопе. Заливал попиксельно только красным цветом, уровень зелёного и синего канала точно равны 0, то есть в них не содержится никакой информации.
Первому пикселю дал 1 в красном канале, второму - 2, третьему - 3 и т.д. по нарастающей. Всего 10 пикселей, соответственно в последнем уровень в красном канале равен 10.

Далее проверяю эти уровни попиксельно с помощью команды уровень(x) = Me.Picture1.Point(x, y), где y для первой строки равен 0, а х изменяется с 0 по 9. (Я верно разобрался, что картинка начинается не с 1-го пикселя, а с 0-ого?)
Вот что я получаю попиксельно:
№ в ФШ результат
0 - 1...........256
1 - 2.............3
2 - 3........131333
3 - 4.........65541
4 - 5...........261
5 - 6............6
6 - 7...........261
7 - 8............8
8 - 9.........65545
9 - 10..........11

Раньше с графикой не работал, поэтому вижу причину такого разнобоя в недостатке знаний у себя. Если кому не трудно, дайте ссылку, которая поможет разобраться.

Добавлено через 8 минут
Добавлю. scale mode стоит в пикселях.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.12.2014, 14:51
Ответы с готовыми решениями:

Чтение карты сети уровней L2 и L3
Добрый день! Есть вопрос о чтении карты сети уровней L2 и L3. Есть карта сети уровня L1 (физическое соединение), L2 и L3. Мне необходимо на...

Неверное чтение данных из COM порта
Привет ребята. Есть проблема с чтением данных из COM-порта. Написал программу на микроконтроллере которая в порт посылает данные(4...

Разграниченный вход: неверное чтение из БД
Из таблицы берутся данные логина и пароля,так же в таблице есть логические переменные администратор и пользователь. При вводе логина и...

27
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
04.12.2014, 15:59
Проект бы показали.
0
0 / 0 / 1
Регистрация: 17.09.2014
Сообщений: 46
04.12.2014, 16:04  [ТС]
Здесь проект, в нём пока много лишнего.
Вложения
Тип файла: rar Шумодав.rar (67.4 Кб, 7 просмотров)
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
04.12.2014, 16:06
У меня антивирус не дает скачать Ваш архив.

Короче, тот цвет, который Вы получаете, еще нужно перевести в RGB.
Сейчас набросаю проект и покажу.
0
0 / 0 / 1
Регистрация: 17.09.2014
Сообщений: 46
04.12.2014, 16:09  [ТС]
Вот начало кода. Делаю принудительную остановку после прочтения первого десятка пикселей и смотрю их уровни.
Visual Basic
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
Private Sub Picture1_DblClick()
 ' Set xl = CreateObject("Excel.Application")
 ' xl.workbooks.open ("d:\Таблицы\Шумодав.xls")
   ' xl.Visible = TrueSavePicture Picture1, ("d:\Таблицы\Шумодав.jpg")
  Dim x As Integer
  Dim y As Integer
  Dim строка  As Integer
  Dim столбец As Integer
  Dim уровень(10) As Long
  Dim ширина As Integer
  Dim высота  As Integer
  Dim среднее  As Double
  Dim i  As Long
  Dim min(1) As Long
  Dim max(1)  As Long
      ширина = Picture1.Width
высота = Picture1.Height
 
  For y = 0 To высота - 1
   строка = 1
  For x = 0 To ширина - 1 Step 10
      'считывание пикселей в строке
      'проверка 10-ти последовательных пикселей и вычисление среднего значения
   уровень(1) = Me.Picture1.Point(x, y)
 ' уровень(1) = Int(Me.Picture1.Point(x, y) / 65793)
  уровень(2) = Me.Picture1.Point(x + 1, y)
 ' уровень(2) = Int(Me.Picture1.Point(x + 1, y) / 65793)
  уровень(3) = Me.Picture1.Point(x + 2, y)
  'уровень(3) = Int(Me.Picture1.Point(x + 2, y) / 65793)
  уровень(4) = Me.Picture1.Point(x + 3, y)
 ' уровень(4) = Int(Me.Picture1.Point(x + 3, y) / 65793)
  уровень(5) = Me.Picture1.Point(x + 4, y)
  'уровень(5) = Int(Me.Picture1.Point(x + 4, y) / 65793)
  уровень(6) = Me.Picture1.Point(x + 5, y)
 ' уровень(6) = Int(Me.Picture1.Point(x + 5, y) / 65793)
  уровень(7) = Me.Picture1.Point(x + 6, y)
 ' уровень(7) = Int(Me.Picture1.Point(x + 6, y) / 65793)
  уровень(8) = Me.Picture1.Point(x + 7, y)
 ' уровень(8) = Int(Me.Picture1.Point(x + 7, y) / 65793)
  уровень(9) = Me.Picture1.Point(x + 8, y)
 ' уровень(9) = Int(Me.Picture1.Point(x + 8, y) / 65793)
  уровень(10) = Me.Picture1.Point(x + 9, y)
 ' уровень(10) = Int(Me.Picture1.Point(x + 9, y) / 65793)
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
04.12.2014, 16:27
Лучший ответ Сообщение было отмечено The trick как решение

Решение

Вот, смотрите, все четко.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Option Explicit
 
Private Sub Command1_Click()
    GetRGB
End Sub
 
Private Sub GetRGB()
    Dim i As Long, j As Long, c As Long
    Dim R As Long, G As Long, B As Long, BG As Long
    For i = 0 To 9
             c = P.Point(i, 0)
             R = c Mod 256
             BG = c / 256
             G = BG Mod 256
             B = BG / 256
             Print "   R = " & R, "G = " & G, "B = " & B
    Next i
End Sub
Вложения
Тип файла: rar RGB.rar (1.5 Кб, 5 просмотров)
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
04.12.2014, 16:35
Цитата Сообщение от Неуч Посмотреть сообщение
ширина = Picture1.Width
Picture1.ScaleWidth ?

И почему Step 10 ? Так задумано?
0
0 / 0 / 1
Регистрация: 17.09.2014
Сообщений: 46
04.12.2014, 16:46  [ТС]
Да, планирую просматривать рисунок небольшими группами по 10 пикселей. Спасибо за подсказку, буду разбираться.
Если я верно понял, то значение, получаемое командой c = P.Point(i, 0) - это произведение всех трёх составляющих цвета? А вот этот фрагмент позволяет выделить из него значения по цветам? Вы облегчили мне продвижение вперёд. Спасибо большое ещё раз.
Visual Basic
1
2
3
4
R = c Mod 256
      BG = c / 256
      G = BG Mod 256
      B = BG / 256
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
04.12.2014, 20:58
Можешь использовать GetDiBits - это многократно ускорит. Также можешь использовать LSet для преобразования Long'а в RGB
0
0 / 0 / 1
Регистрация: 17.09.2014
Сообщений: 46
12.02.2016, 05:32  [ТС]
Создал форму, на ней разместил массив из 49-ти пикчербоксов. В отдельной папке находятся 49 файлов с расширением *.bmp. Каждому рисунку прописано по одному файлу, последовательно. То есть 1-му пикчербоксу - 1-ый файл, последнему - 49-ый. Файлы представляют собой кропы кадров астросессии. Все они на вид одинаковые, но сняты друг за другом. Потому кроме полезной информации содержат и шумы атмосферы. Стоит задача - прочесть уровни одного и того же пикселя на всех кадрах, усреднить результат и записать его в итоговое изображение.

Написал код для считывания уровня цвета на каждом рисунке. Он правильно считывает уровень только в первом кадре, со второго выдаёт уровень "0", со всех последующих "-1". Подскажите, что я делаю не так? Привожу часть кода.
Visual Basic
1
2
        For рисунок= 0 To 48
           уровень(рисунок, 0) = Frm1_Редактор.Рисунок1(рисунок).Point(X, Y)
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
12.02.2016, 07:26
Вопрос:
Цитата Сообщение от Неуч Посмотреть сообщение
Подскажите, что я делаю не так?
Ответ:
Цитата Сообщение от Неуч Посмотреть сообщение
Привожу часть кода
Включаю экстрасенса.
Цитата Сообщение от Неуч Посмотреть сообщение
Он правильно считывает уровень только в первом кадре, со второго выдаёт уровень "0"
Потому что первого кадра(рисунка) у Вас нет, а массив "уровень" начинается с нуля.
Цитата Сообщение от Неуч Посмотреть сообщение
", со всех последующих "-1"
Цитата Сообщение от Неуч Посмотреть сообщение
Frm1_Редактор.Рисунок1(рисунок).Point(X, Y)
Х и У равны 0.
0
0 / 0 / 1
Регистрация: 17.09.2014
Сообщений: 46
12.02.2016, 07:43  [ТС]
Почему они равны нулю? Потому что я не привёл весь код? Это не сбрасывает их значения. Стоят периоды для прохождения построчно и по столбцам. Я привёл ту часть кода, которая выдаёт ошибку.
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
12.02.2016, 08:21
Цитата Сообщение от Неуч Посмотреть сообщение
Я привёл ту часть кода, которая выдаёт ошибку
Смотрите, как работает Ваш код. Не изменил ни одного символа.
Только у меня рисунки от 0 до 48
Миниатюры
Неверное чтение уровней пикселей  
0
0 / 0 / 1
Регистрация: 17.09.2014
Сообщений: 46
12.02.2016, 08:35  [ТС]
Похоже, я сильно запутался и начинаю всё с нуля. Создал новый проект, в нём форму и модуль. На форме разместил один-единственный пикчер-бокс, ему задал рисунок и написал процедуру для копирования изображения с этого пикчер-бокса и переноса его непосредственно на форму. Начинается работа, но встречается уровень пикселя, равный -1. Я знаю о том, что такой уровень соответствует краю изображения. Но это значение попадается и посреди рисунка. И само итоговое изображение занимает на форме крохотный уголок слева вверху форму.

Visual Basic
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
Public Sub перенести_изображение()
 
Dim i As Integer
Dim X As Integer
Dim Y As Integer
Dim ширина As Integer
Dim высота  As Integer
Dim уровень(1, 4) As Long
Dim цвет(3)   As Integer
 
ширина = Форма1.Рисунок1.Width
высота = Форма1.Рисунок1.Height
 
For Y = 1 To высота - 1  'проход по строкам
     For X = 1 To ширина - 1  'проход по столбцам
           уровень(1, 0) = Форма1.Рисунок1.Point(X, Y) 'считывание общего цвета
           уровень(1, 1) = уровень(1, 0) Mod 256 'вычисление красного
           уровень(1, 4) = уровень(1, 0) \ 256
           уровень(1, 2) = уровень(1, 4) Mod 256 'зелёный
           уровень(1, 3) = уровень(1, 4) \ 256 'синий
        For i = 1 To 3 ' по цветам
             цвет(i) = уровень(1, i)
       Next i
        цвет(0) = RGB(цвет(1), цвет(2), цвет(3))
         Форма1.PSet (X / 16, Y / 16), цвет(0)
      Next X
Next Y
 
End Sub
Миниатюры
Неверное чтение уровней пикселей  
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
12.02.2016, 08:43
Цитата Сообщение от Неуч Посмотреть сообщение
ширина = Форма1.Рисунок1.Width
высота = Форма1.Рисунок1.Height
Ну вот, снова здорОва.
Не Width и Height, а ScaleWidth и ScaleHeight (в 7 сообщении уже говорилось)
ScaleMode=3 ' пиксели. И у формы, и у рисунков
Autoredraw=true ' И у формы, и у рисунков
1
0 / 0 / 1
Регистрация: 17.09.2014
Сообщений: 46
12.02.2016, 08:53  [ТС]
Внёс изменения, проверил, запустил. Минусов не увидел, но изображение рисует всё равно крохотное. Я опять чего-то не учитываю.
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
12.02.2016, 08:55
Ваш код(немного подправленный)
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
12.02.2016, 08:56
Цитата Сообщение от Неуч Посмотреть сообщение
крохотное. Я опять чего-то не учитываю.
Повторяю
Цитата Сообщение от SoftIce Посмотреть сообщение
ScaleMode=3 ' пиксели. И у формы, и у рисунков
0
0 / 0 / 1
Регистрация: 17.09.2014
Сообщений: 46
12.02.2016, 09:01  [ТС]
Да, код такой же. Приложил архив с файлом изображения, формат *.bmp. Если у Вас картинка на форме примет такие же размеры, как и у исходника, значит, я вновь ошибаюсь.
Вложения
Тип файла: rar 1.rar (232.5 Кб, 6 просмотров)
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
12.02.2016, 09:10
Цитата Сообщение от Неуч Посмотреть сообщение
Если у Вас картинка на форме примет такие же размеры, как и у исходника, значит, я вновь ошибаюсь.
Исходную картинку уменьшил в 3 раза, а то не влазит в монитор
Миниатюры
Неверное чтение уровней пикселей  
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.02.2016, 09:10
Помогаю со студенческими работами здесь

Неверное чтение файла в другой кодировке
Помогите исправить #include "stdafx.h" #include "conio.h" #include <fstream> #include "stdio.h" #include <string> ...

Неверное чтение данных из БД с отличающейся кодировкой
Добрый вечер. Помогите советом. Соединяюсь с БД: $db = new PDO('mysql:host=localhost;dbname=' . DATABASE, DBUSER, DBPASSWORD,...

Image со свойством Stretch=True и чтение пикселей
Привет. Есть картинко в Image1. У самого Image1 стоит свойство Stretch=True и Proportional=True. Image1 размером 320x200. Таким образом...

Согласование уровней
Доброго времени суток. Имеется плата webservera хотелприкрутить к нему DS18B20. webserver питается напряжением 3,3. поскажите как...

Задача в 5 уровней
Есть задача с 5 архивами,у кождого архива есть txt файл и новый архив,что бы открыть первый уровень нужно расшифровать нулевой txt....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru