Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.03.2011, 20:01
Sanny007 Sanny007 вне форума
Прохожий
 
Регистрация: 14.03.2011
Сообщения: 15
Репутация: 10
По умолчанию переводить выбранный рисунок из файла в схему для вышивания

Здравствуйте! Написала программу, и немного запуталась в ней. Программа должна переводить выбранный рисунок из файла в схему для вышивания. Помогите, пожалуйста, найти ошибку. Зарание спасибо.
Вот весь код:
Код:
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  
Старый 27.03.2011, 20:50
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

ммммммм... знакомые строчки кода...Это я на счет нахождения среднего цвета в блоке. Смотри, у тебя значение переменной Csr находится
как 1/(k*k). Это не совсем верно. если у тебя размер блока например 5Х5 то, если находить среднее значение для точки с координатой (1,1) то реальное количество точек, окружающих эту точку не будет равно 5Х5. поэтому тебе в этом алгоритме нужно динамически вычислять Csr .
Когда давал код, думал ты хоть чуть-чуть посмотришь и разберешься с алгоритмом, и сама до выше написанного додумаешься..
Ответить с цитированием
  #3  
Старый 29.03.2011, 10:18
Sanny007 Sanny007 вне форума
Прохожий
 
Регистрация: 14.03.2011
Сообщения: 15
Репутация: 10
По умолчанию

Если я правильно поняла, то размер блока равен k*k, (т.е. сама картинка поделена на несколько небольших блоков). Да и преподаватель, когда мне помогал с алгоритмом , выделил, что в цикле перебора по всем блокам входной картинки, размер блока k*k. проблема в том, что программа не запускается вообще... Нужно найти ошибку, я сама, кажется, очень сильно запуталась ))), вот и прошу Вашей помощи. Заранее спасибо.
Ответить с цитированием
  #4  
Старый 29.03.2011, 10:39
Black Raider Black Raider вне форума
Местный
 
Регистрация: 31.05.2010
Адрес: Москва
Сообщения: 466
Версия Delphi: 7
Репутация: 40
По умолчанию

не совсем понятно вот это:

Код:
k:=Win/Wout;
k:=Hin/Hout;
теряется значение k:=Win/Wout;

Далее в цикле for могут использоваться только целые значения.
выход или округлять или обрезать знаки после запятой.
__________________
Новый вирус - "БОМЖ"! Он просто роется в Корзине...и спит под ярлычком "Сетевое окружение"
Ответить с цитированием
  #5  
Старый 29.03.2011, 10:51
Sanny007 Sanny007 вне форума
Прохожий
 
Регистрация: 14.03.2011
Сообщения: 15
Репутация: 10
По умолчанию

В данных строчках. я определяю коэффициент масштабирования, т.е. фиксирую ширину и длину картинки... Согластна, что длина теряется. А если написать так: k:=(Win/Wout)*(Hin/Hout)? Конечно, не уверена, что правильно... ))).
Ответить с цитированием
  #6  
Старый 29.03.2011, 10:53
Black Raider Black Raider вне форума
Местный
 
Регистрация: 31.05.2010
Адрес: Москва
Сообщения: 466
Версия Delphi: 7
Репутация: 40
По умолчанию

Ну судя по алгоритму надо еще одну переменную завести которая в дальнейшем будет использоваться в цикле.
__________________
Новый вирус - "БОМЖ"! Он просто роется в Корзине...и спит под ярлычком "Сетевое окружение"
Ответить с цитированием
  #7  
Старый 29.03.2011, 11:08
Sanny007 Sanny007 вне форума
Прохожий
 
Регистрация: 14.03.2011
Сообщения: 15
Репутация: 10
По умолчанию

Если добавить еще одну переменную и перебирать цикл по этим 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.
Выдает несколько ошибок: "For loop control variable must be simple local variable", так же по какой-то причине пишет, что неизвестный идентификатор "texture".
Ответить с цитированием
  #8  
Старый 29.03.2011, 11:22
Black Raider Black Raider вне форума
Местный
 
Регистрация: 31.05.2010
Адрес: Москва
Сообщения: 466
Версия Delphi: 7
Репутация: 40
По умолчанию

Он выдает несколько предупреждений (!!!) что для переменной цикла используется глобальная переменная.

ошибка ниже, в цикле FOR используются целые значения у вас диапазон указан в вещественом!!!

нет такого свойства texture у класса Timage
__________________
Новый вирус - "БОМЖ"! Он просто роется в Корзине...и спит под ярлычком "Сетевое окружение"
Ответить с цитированием
  #9  
Старый 29.03.2011, 11:35
Sanny007 Sanny007 вне форума
Прохожий
 
Регистрация: 14.03.2011
Сообщения: 15
Репутация: 10
По умолчанию

Если я задаю переменным i,j,ii,jj целы тип, оибка все равно не уходит. Какое свойство можно использовать вместо texture для класса Timage? Зарание огромной спасибо за помощь )))
Ответить с цитированием
  #10  
Старый 29.03.2011, 12:00
Black Raider Black Raider вне форума
Местный
 
Регистрация: 31.05.2010
Адрес: Москва
Сообщения: 466
Версия Delphi: 7
Репутация: 40
По умолчанию

Цитата:
Сообщение от Sanny007
Если я задаю переменным i,j,ii,jj целы тип, оибка все равно не уходит. Какое свойство можно использовать вместо texture для класса Timage? Зарание огромной спасибо за помощь )))
а переменные k и l ?
используйте for i:=round(-k) to round(k) do

вместо texture... помоему ничего, по крайней мере я незнаю, как вариант определять цвет точки через свойство канвас, далее его разбивать на RGB и уже потом использовать в вашем алгоритме.
может и есть вариант проще.
__________________
Новый вирус - "БОМЖ"! Он просто роется в Корзине...и спит под ярлычком "Сетевое окружение"
Ответить с цитированием
  #11  
Старый 30.03.2011, 11:31
Sanny007 Sanny007 вне форума
Прохожий
 
Регистрация: 14.03.2011
Сообщения: 15
Репутация: 10
По умолчанию

Я определила переменные 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  
Старый 30.03.2011, 11:46
Black Raider Black Raider вне форума
Местный
 
Регистрация: 31.05.2010
Адрес: Москва
Сообщения: 466
Версия Delphi: 7
Репутация: 40
По умолчанию

программа не ошибку выдает! а предупреждение что вы в цикле процедуры используете НЕ локальные переменные а глобальные.
опишите в процедуре переменные i, j, ii, jj и компилятор перестанет в вас плеваться по этому поводу.
__________________
Новый вирус - "БОМЖ"! Он просто роется в Корзине...и спит под ярлычком "Сетевое окружение"
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:06.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025