![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Здравствуйте! Написала программу, и немного запуталась в ней. Программа должна переводить выбранный рисунок из файла в схему для вышивания. Помогите, пожалуйста, найти ошибку. Зарание спасибо.
Вот весь код: Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Jpeg; type TForm1 = class(TForm) Button1: TButton; OpenDialog1: TOpenDialog; Button2: TButton; Image1: TImage; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var k: real; Csr: real; Cn: real; r,g,b: integer; i,j,ii: integer; jj,ik,jk:real; Win, Wout, Hin, Hout: integer; Nmin,N, Cmin:real; Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin close; end; procedure TForm1.Button2Click(Sender: TObject); begin // Выбираем картинку if opendialog1.Execute then // Определяем коэффициент масштабирования картинки k:=Win/Wout; k:=Hin/Hout; // Цикл перебора по всем блокам входной картинки. Размер блока k*k begin // Вычисляем средний цвет блока Csr:=1/(sqr(k)); for i:=0 to Image1.Width do for j:=0 to Image1.Height do begin r:=0; g:=0; b:=0; for ii:= -k to k do for jj:= -k to k do begin ik:=i+ii; jk:=j+jj; if (ik>=0) and (jk>=0) and (ik<= Image1.width) and (jk<= Image1.Height) then begin r:=r+Image1.texture[jk,ik].r; g:=g+Image1.texture[jk,ik].g; b:=b+Image1.texture[jk,ik].b; end; Image1.texture[j,i].r:=round(r*Csr); Image1.texture[j,i].g:=round(g*Csr); Image1.texture[j,i].b:=round(b*Csr); end; end; end; // Подбираем наиближайший цвет Nmin из набора среднему цвету блока Csr begin Nmin:=1000; // Цикл по всем цветам Cn. Вычисляем расстояние между цветами Сn и Csr begin N:=(Csr-Cn)/Csr; if N < Nmin then Nmin:=N; Cmin:=Cn; end; end; // Вставляем цвет в ячейку выходной картинки соответсвующий блоку входной картинки Cmin:=Cmin+Image1.texture[jk,ik].Cmin; end; end; end; end. |
#2
|
||||
|
||||
![]() ммммммм... знакомые строчки кода...Это я на счет нахождения среднего цвета в блоке. Смотри, у тебя значение переменной Csr находится
как 1/(k*k). Это не совсем верно. если у тебя размер блока например 5Х5 то, если находить среднее значение для точки с координатой (1,1) то реальное количество точек, окружающих эту точку не будет равно 5Х5. поэтому тебе в этом алгоритме нужно динамически вычислять Csr . Когда давал код, думал ты хоть чуть-чуть посмотришь и разберешься с алгоритмом, и сама до выше написанного додумаешься.. |
#3
|
|||
|
|||
![]() Если я правильно поняла, то размер блока равен k*k, (т.е. сама картинка поделена на несколько небольших блоков). Да и преподаватель, когда мне помогал с алгоритмом , выделил, что в цикле перебора по всем блокам входной картинки, размер блока k*k. проблема в том, что программа не запускается вообще... Нужно найти ошибку, я сама, кажется, очень сильно запуталась ))), вот и прошу Вашей помощи. Заранее спасибо.
|
#4
|
|||
|
|||
![]() не совсем понятно вот это:
Код:
k:=Win/Wout; k:=Hin/Hout; Далее в цикле for могут использоваться только целые значения. выход или округлять или обрезать знаки после запятой. Новый вирус - "БОМЖ"! Он просто роется в Корзине...и спит под ярлычком "Сетевое окружение" |
#5
|
|||
|
|||
![]() В данных строчках. я определяю коэффициент масштабирования, т.е. фиксирую ширину и длину картинки... Согластна, что длина теряется. А если написать так: k:=(Win/Wout)*(Hin/Hout)? Конечно, не уверена, что правильно... ))).
|
#6
|
|||
|
|||
![]() Ну судя по алгоритму надо еще одну переменную завести которая в дальнейшем будет использоваться в цикле.
Новый вирус - "БОМЖ"! Он просто роется в Корзине...и спит под ярлычком "Сетевое окружение" |
#7
|
|||
|
|||
![]() Если добавить еще одну переменную и перебирать цикл по этим 2 переменным, то программа все равно не работает (((. Помогите понять причину. Заранее спасибо.
Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Jpeg; type TForm1 = class(TForm) Button1: TButton; OpenDialog1: TOpenDialog; Button2: TButton; Image1: TImage; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var k,l: real; Csr: real; Cn: real; r,g,b: integer; i,j,ii: integer; jj,ik,jl:real; Win, Wout, Hin, Hout: integer; Nmin,N, Cmin:real; Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin close; end; procedure TForm1.Button2Click(Sender: TObject); begin // Выбираем картинку if opendialog1.Execute then // Определяем коэффициент масштабирования картинки k:=Win/Wout; l:=Hin/Hout; // Цикл перебора по всем блокам входной картинки. Размер блока k*k begin // Вычисляем средний цвет блока Csr:=1/(sqr(k)); for i:=0 to Image1.Width do for j:=0 to Image1.Height do begin r:=0; g:=0; b:=0; for ii:= -k to k do for jj:= -l to l do begin ik:=i+ii; jl:=j+jj; if (ik>=0) and (jl>=0) and (ik<= Image1.width) and (jl<= Image1.Height) then begin r:=r+Image1.texture[jl,ik].r; g:=g+Image1.texture[jl,ik].g; b:=b+Image1.texture[jl,ik].b; end; Image1.texture[j,i].r:=round(r*Csr); Image1.texture[j,i].g:=round(g*Csr); Image1.texture[j,i].b:=round(b*Csr); end; end; end; // Подбираем наиближайший цвет Nmin из набора среднему цвету блока Csr begin Nmin:=1000; // Цикл по всем цветам Cn. Вычисляем расстояние между цветами Сn и Csr begin N:=(Csr-Cn)/Csr; if N < Nmin then Nmin:=N; Cmin:=Cn; end; end; // Вставляем цвет в ячейку выходной картинки соответсвующий блоку входной картинки Cmin:=Cmin+Image1.texture[jl,ik].Cmin; end; end; end; end. |
#8
|
|||
|
|||
![]() Он выдает несколько предупреждений (!!!) что для переменной цикла используется глобальная переменная.
ошибка ниже, в цикле FOR используются целые значения у вас диапазон указан в вещественом!!! нет такого свойства texture у класса Timage Новый вирус - "БОМЖ"! Он просто роется в Корзине...и спит под ярлычком "Сетевое окружение" |
#9
|
|||
|
|||
![]() Если я задаю переменным i,j,ii,jj целы тип, оибка все равно не уходит. Какое свойство можно использовать вместо texture для класса Timage? Зарание огромной спасибо за помощь )))
|
#10
|
|||
|
|||
![]() Цитата:
используйте for i:=round(-k) to round(k) do вместо texture... помоему ничего, по крайней мере я незнаю, как вариант определять цвет точки через свойство канвас, далее его разбивать на RGB и уже потом использовать в вашем алгоритме. может и есть вариант проще. Новый вирус - "БОМЖ"! Он просто роется в Корзине...и спит под ярлычком "Сетевое окружение" |
#11
|
|||
|
|||
![]() Я определила переменные i, j, ii, jj, k, l как целый тип, но программа все равно выдает ошибку: "For loop control variable must be simple local variable", и указывает на строки:
for i:=0 to Image1.Width do for j:=0 to Image1.Height do и for ii:= -k to k do for jj:= -l to l do В чем ошибка? Подскажите, пожалуйста. Еще раз, заранее спасибо. |
#12
|
|||
|
|||
![]() программа не ошибку выдает! а предупреждение что вы в цикле процедуры используете НЕ локальные переменные а глобальные.
опишите в процедуре переменные i, j, ii, jj и компилятор перестанет в вас плеваться по этому поводу. Новый вирус - "БОМЖ"! Он просто роется в Корзине...и спит под ярлычком "Сетевое окружение" |