![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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 и компилятор перестанет в вас плеваться по этому поводу. |