Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.04.2010, 11:43   #11
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

из серии "cемен-семеныч"...
Код:
procedure TForm1.Button2Click(Sender: TObject);
var bt: TBitmap;
begin
 Image2.Picture.Bitmap.Assign(bt);
...
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 14.04.2010, 11:59   #12
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
По умолчанию

raxp, в моем коде стоит то, что вы выделили). Но не работает.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 14.04.2010, 12:48   #13
ArtInt
Форумчанин
 
Аватар для ArtInt
 
Регистрация: 06.03.2009
Сообщений: 583
По умолчанию

А объект bt точно создан?
Код:
bt:=TBitmap.Create;
и после освобождаем в конце всего кода:
Код:
bt.Free;
Не стыдно чего-то не знать, стыдно не стремиться к знаниям.
ArtInt вне форума Ответить с цитированием
Старый 14.04.2010, 13:07   #14
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...намек идет на то, что вы не создали <bt> ...мало того, ничего в нее не загрузили/
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 14.04.2010, 17:48   #15
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
По умолчанию

Сделал как было сказано в посте №13:
Код:
procedure TForm1.Button2Click(Sender: TObject);
// algo de Floyd-Steinberg
var
 rw,w,h,i,j,k,l:integer;
 gc,g:integer;
 p:pbytearray;
 tab:array of integer;
 bt: TBitmap;
begin
 bt:=TBitmap.Create;
 Image2.Picture.Bitmap.Assign(bt);
 w:=Image2.Picture.Bitmap.Width;
 h:=Image2.Picture.Bitmap.Height;
 rw := (((w * 32) + 31) and not 31) div 8;

 p:=Image2.Picture.Bitmap.ScanLine[h-1];
 w:=w+1;
 h:=h+1;
 SetLength(tab,w*h);

 //passe l'image en niveau de gris et sauve le tout dans tab
 for j:=0 to h-1 do
 for i:=0 to w-1 do
 if (i=w-1) or (j=h-1) then tab[i+w*j]:=0
 else
 begin
  k:=i*4+j*rw;
  // 30% de rouge, 59% de vert, 11% de bleu
  l:=(76*p[k+2]+151*p[k+1]+29*p[k+0]) div 256;
  tab[i+w*j] :=l;
 end;

 // effectue l'algo de Floyd-Steinberg dans tab
 for j:=0 to h-2 do
 for i:=0 to w-2 do
  begin
   k:=i+j*w;
   gc:=tab[k];
   if gc<128 then g:=0 else g:=255;
   gc:=gc-g;
   tab[k]:=g;
   tab[k+1]:=tab[k+1]+gc*7 div 16;
   tab[k-1+w]:=tab[k-1+w]+gc*3 div 16;
   tab[k+0+w]:=tab[k+0+w]+gc*5 div 16;
   tab[k+1+w]:=tab[k+1+w]+gc*1 div 16;
  end;

 // transfert tab dans le bitmap
 for j:=0 to h-2 do
 for i:=0 to w-2 do
  begin
   k:=i*4+j*rw;
   p[k+2]:=tab[i+w*j];
   p[k+1]:=tab[i+w*j];
   p[k+0]:=tab[i+w*j];
  end;
  bt.Free;
end;
Теперь выдается ошибка: "Scan line index out of range"
???
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 14.04.2010, 18:10   #16
ArtInt
Форумчанин
 
Аватар для ArtInt
 
Регистрация: 06.03.2009
Сообщений: 583
По умолчанию

А загрузить изображение (raxp уже об этом упомянул).

Код:
  bt.LoadFromFile('MyFile.bmp');
И зачем Вам здесь TBitmap? Если судя по коду обращение сразу идет к Image? А в Image, тогда изображение загружено?
Немного код, наверное надо переделать и обращаться к битмап, а потом для вывода результата в конце уже через Assign сделать отображение для Image. И после этого освободить битмап (Free).
Не стыдно чего-то не знать, стыдно не стремиться к знаниям.
ArtInt вне форума Ответить с цитированием
Старый 14.04.2010, 20:05   #17
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
По умолчанию

Цитата:
А в Image, тогда изображение загружено?
Да, загружено.
Цитата:
Немного код, наверное надо переделать и обращаться к битмап,
Каким это образом?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 15.04.2010, 00:05   #18
ArtInt
Форумчанин
 
Аватар для ArtInt
 
Регистрация: 06.03.2009
Сообщений: 583
По умолчанию

Вот что примерно имел ввиду, если через Image:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
 rw,w,h,i,j,k,l:integer;
 gc,g:integer;
 p:pbytearray;
 tab:array of integer;
 bt: TBitmap;
begin
// Image2.Picture.Bitmap.Assign(bt);
  Image2.Picture.LoadFromFile('1obr.bmp');

 w:=Image2.Picture.Bitmap.Width;
 h:=Image2.Picture.Bitmap.Height;
 rw := (((w * 32) + 31) and not 31) div 8;

 p:=Image2.Picture.Bitmap.ScanLine[h-1];
 w:=w+1;
 h:=h+1;
 SetLength(tab,w*h);

 //passe l'image en niveau de gris et sauve le tout dans tab
 for j:=0 to h-1 do
 for i:=0 to w-1 do
 if (i=w-1) or (j=h-1) then tab[i+w*j]:=0
 else
 begin
  k:=i*4+j*rw;
  // 30% de rouge, 59% de vert, 11% de bleu
  l:=(76*p[k+2]+151*p[k+1]+29*p[k+0]) div 256;
  tab[i+w*j] :=l;
 end;

 // effectue l'algo de Floyd-Steinberg dans tab
 for j:=0 to h-2 do
 for i:=0 to w-2 do
  begin
   k:=i+j*w;
   gc:=tab[k];
   if gc<128 then g:=0 else g:=255;
   gc:=gc-g;
   tab[k]:=g;
   tab[k+1]:=tab[k+1]+gc*7 div 16;
   tab[k-1+w]:=tab[k-1+w]+gc*3 div 16;
   tab[k+0+w]:=tab[k+0+w]+gc*5 div 16;
   tab[k+1+w]:=tab[k+1+w]+gc*1 div 16;
  end;

 // transfert tab dans le bitmap
 for j:=0 to h-2 do
 for i:=0 to w-2 do
  begin
   k:=i*4+j*rw;
   p[k+2]:=tab[i+w*j];
   p[k+1]:=tab[i+w*j];
   p[k+0]:=tab[i+w*j];
  end;
end;
если через Bitmap:
Код:
procedure TForm1.BitBtn2Click(Sender: TObject);
var
 rw,w,h,i,j,k,l:integer;
 gc,g:integer;
 p:pbytearray;
 tab:array of integer;
 bt: TBitmap;
begin
 bt:=TBitmap.Create;
 Bt.PixelFormat:=pf8bit;
 Bt.LoadFromFile('1obr.bmp');

 
//  Image2.Picture.LoadFromFile('1obr.bmp');

 w:=bt.Width;
 h:=bt.Height;
 rw := (((w * 32) + 31) and not 31) div 8;

 p:=bt.ScanLine[h-1];
 w:=w+1;
 h:=h+1;
 SetLength(tab,w*h);

 //passe l'image en niveau de gris et sauve le tout dans tab
 for j:=0 to h-1 do
 for i:=0 to w-1 do
 if (i=w-1) or (j=h-1) then tab[i+w*j]:=0
 else
 begin
  k:=i*4+j*rw;
  // 30% de rouge, 59% de vert, 11% de bleu
  l:=(76*p[k+2]+151*p[k+1]+29*p[k+0]) div 256;
  tab[i+w*j] :=l;
 end;

 // effectue l'algo de Floyd-Steinberg dans tab
 for j:=0 to h-2 do
 for i:=0 to w-2 do
  begin
   k:=i+j*w;
   gc:=tab[k];
   if gc<128 then g:=0 else g:=255;
   gc:=gc-g;
   tab[k]:=g;
   tab[k+1]:=tab[k+1]+gc*7 div 16;
   tab[k-1+w]:=tab[k-1+w]+gc*3 div 16;
   tab[k+0+w]:=tab[k+0+w]+gc*5 div 16;
   tab[k+1+w]:=tab[k+1+w]+gc*1 div 16;
  end;

 // transfert tab dans le bitmap
 for j:=0 to h-2 do
 for i:=0 to w-2 do
  begin
   k:=i*4+j*rw;
   p[k+2]:=tab[i+w*j];
   p[k+1]:=tab[i+w*j];
   p[k+0]:=tab[i+w*j];
  end;

 Image2.Picture.Bitmap:=bt;
 Bt.Free;

end;
Но не могу сказать правильно ли сам алгоритм работает, надо посмотреть его повнимательней.
Не стыдно чего-то не знать, стыдно не стремиться к знаниям.
ArtInt вне форума Ответить с цитированием
Старый 15.04.2010, 00:54   #19
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Флойд-Стенберг это ты в нужную сторону копаешь. Если результат будет не совсем хороший, еще можно квантизацию (перевод в BW по сути тоже квантизация) применить после блера или антиалиаса, тоже хорошо контуры навести можно.

Цитата:
Image2.Picture.Bitmap:=bt;
Bt.Free;
По-моему так нельзя делать, ты присвоил ссылку на битмап в Picture.Bitmap и тут же его удаляешь, ошибка будет. Assign используй в данном случае.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 15.04.2010, 06:36   #20
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
По умолчанию

Ок, для начала пробую сделать через Image:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
 rw,w,h,i,j,k,l:integer;
 gc,g:integer;
 p:pbytearray;
 tab:array of integer;
 bt: TBitmap;
begin
 w:=Image2.Picture.Bitmap.Width;
 h:=Image2.Picture.Bitmap.Height;
 rw := (((w * 32) + 31) and not 31) div 8;

 p:=Image2.Picture.Bitmap.ScanLine[h-1];
 w:=w+1;
 h:=h+1;
 SetLength(tab,w*h);

 //passe l'image en niveau de gris et sauve le tout dans tab
 for j:=0 to h-1 do
 for i:=0 to w-1 do
 if (i=w-1) or (j=h-1) then tab[i+w*j]:=0
 else
 begin
  k:=i*4+j*rw;
  // 30% de rouge, 59% de vert, 11% de bleu
  l:=(76*p[k+2]+151*p[k+1]+29*p[k+0]) div 256;
  tab[i+w*j] :=l;
 end;

 // effectue l'algo de Floyd-Steinberg dans tab
 for j:=0 to h-2 do
 for i:=0 to w-2 do
  begin
   k:=i+j*w;
   gc:=tab[k];
   if gc<128 then g:=0 else g:=255;
   gc:=gc-g;
   tab[k]:=g;
   tab[k+1]:=tab[k+1]+gc*7 div 16;
   tab[k-1+w]:=tab[k-1+w]+gc*3 div 16;
   tab[k+0+w]:=tab[k+0+w]+gc*5 div 16;
   tab[k+1+w]:=tab[k+1+w]+gc*1 div 16;
  end;

 // transfert tab dans le bitmap
 for j:=0 to h-2 do
 for i:=0 to w-2 do
  begin
   k:=i*4+j*rw;
   p[k+2]:=tab[i+w*j];
   p[k+1]:=tab[i+w*j];
   p[k+0]:=tab[i+w*j];
  end;
end;
Сначала я через OpenPictureDialog1 загружаю .bmp изображение в Image, потом нажимаю на кнопку. Но сейчас выдается уже другая ошибка. Каждый раз ошибка новая. Это хорошо, это значит, что прогресс наблюдается . В этот раз появляется Access Violation и выделяется строка, которую я выделил в коде. Может кто-то сможет подробно пояснить по-русски) этот код, а то по-немецки как-то я не очень?)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поле слияния в виде ряда заполненных клеток Nash1 Microsoft Office Word 5 17.07.2009 23:07
количество цифр и количество символов до первой гласной буквы 111111 Общие вопросы C/C++ 2 22.12.2008 12:15
Подсчёт непустых клеток mik Microsoft Office Excel 7 27.10.2007 13:40
ComboBox - убийца нервных клеток krem Компоненты Delphi 20 15.06.2007 22:07