For f = 0 To fbox(0).Width
For g = 0 To fbox(0).Height
l = Picture1.Point(f, g) 'Pixel 1 code
m = fbox(1).Point(f, g) 'Pixel 2 code
Col1 = DecToBin(CStr(l))
Col2 = DecToBin(CStr(m))
R1 = Val(BinToDec(Mid(Col1, 17, 8)))
G1 = Val(BinToDec(Mid(Col1, 9, 8)))
B1 = Val(BinToDec(Mid(Col1, 1, 8)))
R2 = Val(BinToDec(Mid(Col2, 17, 8)))
G2 = Val(BinToDec(Mid(Col2, 9, 8)))
B2 = Val(BinToDec(Mid(Col2, 1, 8)))
If R1 > R2 Then R1 = R1 - 1
If G1 > G2 Then G1 = G1 - 1
If B1 > B2 Then B1 = B1 - 1
If R1 < R2 Then R1 = R1 + 1
If G1 < G2 Then G1 = G1 + 1
If B1 < B2 Then B1 = B1 + 1
Col1 = Val(BinToDec((DecToBin(CStr(R1)) + DecToBin(CStr(G1)) + DecToBin(CStr(B1)))))
Picture1.PSet (f, g), Col1
2 Next g
Next f
Особист писал(а):Если первое значение больше второго - уменьшаю на 1, а если больше - то увеличиваю на 1.
Особист писал(а):Alibek, подскажи пож-та разница между чем и чем, и как получить кол-во шагов?
В контексте приведённого примера к сожалению мне совсем не очевидно, помогите разобраться pls))
Особист писал(а):В контексте приведённого примера к сожалению мне совсем не очевидно, помогите разобраться pls))
Особист писал(а):просто осваиваю работу с цветами в VB
Col1 = Val(BinToDec((DecToBin(CStr(R1)) + DecToBin(CStr(G1)) + DecToBin(CStr(B1)))))
R = Col And &HFF
G = Col \ &H100 And &HFF
B = Col \ &H10000 And &HFF
Col=RGB(R,G,B)
iGrok писал(а):Особист, ты моё сообщение не прочитал, или из принципа на него внимания не обратил?
Алибек тебе чётко сказал, в чём ошибка в алгоритме. А я привел пример, как её исправить.
Alec писал(а):Его алгоритм тоже работает.
alibek писал(а):Alec писал(а):Его алгоритм тоже работает.
Его алгоритм не может работать.
Не хватает внешнего цикла, градиента.
Alec писал(а):Сколько раз выполняется приведенный тобой код?
Особист писал(а):Alec, всегда по-разному, т.к. неизвестно сколько раз нужно изменить цвет каждого пикселя, чтобы достигнуть конечного изображения.
Поэтому я предполагал реализовать счётчик или флаг, типа
1 count = 0
... начало цикла обработки
... если случилось изменить цвет пикселя, то count = count + 1
... конец цикла обработки
doevents 'это чтобы было видно результат и не зависало'
if count then goto 1
Но гонял код просто по нажатию кнопки, т.к. уже на 2-3 преобразованиях становилось понятно, что картинка рисуется не так, как задумано.
Command4.Enabled = False
pix = 0
st = Val(Combo1)
0 cnt = 0
For f = 0 To 100
For g = 0 To 100
l = Picture1.Point(f, g)
m = pic(1).Point(f, g)
If l - m = 0 Then GoTo 1
If Not cnt Then cnt = cnt + 1
R1 = l And &HFF
G1 = l \ &H100 And &HFF
B1 = l \ &H10000 And &HFF
R2 = m And &HFF
G2 = m \ &H100 And &HFF
B2 = m \ &H10000 And &HFF
If st = 1 Then GoTo 1
If Abs(R1 - R2) <= st Then R1 = R2
If Abs(G1 - G2) <= st Then G1 = G2
If Abs(B1 - B2) <= st Then B1 = B2
1 If R1 > R2 Then R1 = R1 - st
If G1 > G2 Then G1 = G1 - st
If B1 > B2 Then B1 = B1 - st
If R1 < R2 Then R1 = R1 + st
If G1 < G2 Then G1 = G1 + st
If B1 < B2 Then B1 = B1 + st
l = RGB(R1, G1, B1)
Picture1.PSet (f, g), l
2 Next g
If f = 100 / Val(Combo2) Then AddPic
Next f
Me.Caption = "Изменений: " + CStr(cnt)
DoEvents
If Command4.Enabled = True Then Exit Sub
If cnt Then GoTo 0
Скачать проект
Alec писал(а):Дико, страшно - но цикл!
но тем не менее пусть и тормознуто, но работает.
Сейчас этот форум просматривают: Google-бот, SemrushBot и гости: 44