Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 794

/ вопрос открыт /

Здравствуйте! увожаемые эксперты...
ниже приведен код надеюсь вы поможите разобраться... я этот код в нете нашел... суть в следующим... код должен делать изображение более четким... я его как смог одоптировал к своей проге но резутьтата нет... может кто может помочь...

Приложение:
  1. var i, j, k, re, gr, bl, bmh, bmw, inta, intb, BytesPerScanline: integer;
  2. sr: array[0..2] of PByte;
  3. st: array[0..4] of pRGBTriple;
  4. tr: PByte;
  5. tt, p: pRGBTriple;
  6. beta, alpha: Single;
  7. begin
  8. Assert((image1.Width > 2) and (image1.Height > 2), 'Bitmap must be at least 3x3');
  9. Assert((alpha > 0) and (alpha < 6), 'Alpha must be >1 and <6');
  10. beta := (alpha - 1) / 5;
  11. intb := round(beta * $10000);
  12. inta := round(alpha * $10000);
  13. image1.Picture.Bitmap.PixelFormat := pf24bit;
  14. image2.Picture.Bitmap.PixelFormat := pf24bit;
  15. image2.Width := image1.Width;
  16. image2.Height := image1.Height;
  17.  
  18. bmw := image1.Width - 2;
  19. bmh := image1.Height - 2;
  20. BytesPerScanline := (((bmw + 2) * 24 + 31) and not 31) div 8;
  21. tr := image1.Picture.Bitmap.ScanLine[0];
  22. tt := pRGBTriple(tr);
  23. sr[0] := image1.Picture.Bitmap.ScanLine[0];
  24. st[0] := pRGBTriple(sr[0]);
  25. for j := 0 to bmw + 1 do
  26. begin
  27. tt^ := st[0]^;
  28. inc(tt);
  29. inc(st[0]);
  30. end;
  31. sr[1] := PByte(integer(sr[0]) - BytesPerScanline);
  32. sr[2] := PByte(integer(sr[1]) - BytesPerScanline);
  33. for i := 1 to bmh do
  34. begin
  35. Dec(tr, BytesPerScanline);
  36. tt := pRGBTriple(tr);
  37. st[0] := pRGBTriple(integer(sr[0]) + 3); //top
  38. st[1] := pRGBTriple(sr[1]); //left
  39. st[2] := pRGBTriple(integer(sr[1]) + 3); //center
  40. st[3] := pRGBTriple(integer(sr[1]) + 6); //right
  41. st[4] := pRGBTriple(integer(sr[2]) + 3); //bottom
  42. tt^ := st[1]^; //1st col unchanged
  43. for j := 1 to bmw do
  44. begin
  45. re := 0; gr := 0; bl := 0;
  46. for k := 0 to 4 do
  47. begin
  48. re := re + st[k]^.rgbtRed;
  49. gr := gr + st[k]^.rgbtGreen;
  50. bl := bl + st[k]^.rgbtBlue;
  51. inc(st[k]);
  52. end;
  53. re := (intb * re + $7FFF) shr 16;
  54. gr := (intb * gr + $7FFF) shr 16;
  55. bl := (intb * bl + $7FFF) shr 16;
  56. p := pRGBTriple(st[1]);
  57. re := (inta * p^.rgbtRed + $7FFF) shr 16 - re;
  58. gr := (inta * p^.rgbtGreen + $7FFF) shr 16 - gr;
  59. bl := (inta * p^.rgbtBlue + $7FFF) shr 16 - bl;
  60. inc(tt);
  61. if re < 0 then re := 0 else if re > 255 then re := 255;
  62. if gr < 0 then gr := 0 else if gr > 255 then gr := 255;
  63. if bl < 0 then bl := 0 else if bl > 255 then bl := 255;
  64. tt^.rgbtRed := re;
  65. tt^.rgbtGreen := gr;
  66. tt^.rgbtBlue := bl;
  67. end;
  68. inc(tt);
  69. inc(st[1]);
  70. tt^ := st[1]^; //Last col unchanged
  71. sr[0] := sr[1];
  72. sr[1] := sr[2];
  73. Dec(sr[2], BytesPerScanline);
  74. end;
  75. Dec(tr, BytesPerScanline);
  76. tt := pRGBTriple(tr);
  77. st[1] := pRGBTriple(sr[1]);
  78. for j := 0 to bmw + 1 do
  79. begin
  80. tt^ := st[1]^;
  81. inc(tt); inc(st[1]);
  82. end;


Fox Nick Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Fox Nick (статус: Посетитель)
Вопрос отправлен: 20 февраля 2010, 21:33
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 9; последнее сообщение — 21 февраля 2010, 12:11; участников в обсуждении: 3.
Егор

Егор (статус: 10-ый класс), 20 февраля 2010, 21:54 [#1]:

это весь код? или это код какого-то обработчика? тогда где заголовок процедуры/функции?

а вот здесь:

Цитата (Fox Nick):


var ...
   beta, alpha: Single;
begin
   Assert((image1.Width > 2) and (image1.Height > 2), 'Bitmap must be at least 3x3');
   Assert((alpha > 0) and (alpha < 6), 'Alpha must be >1 and <6');
   beta := (alpha - 1) / 5;
   intb := round(beta * $10000);
   inta := round(alpha * $10000);
...

я вижу попытку работы с неинициализированными переменными
Assert((alpha > 0) and (alpha < 6), 'Alpha must be >1 and <6');
чему равно значение alpha? я думаю, что нулю :) не важно при этом, чему равен уровень прозрачности картинки
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Fox Nick

Fox Nick (статус: Посетитель), 20 февраля 2010, 22:09 [#2]:

вообщем жтот кусок я совсем не понял... я думал что это просто описание параметров для картинки...
код весь... я его просто в кнопку это все вставил...))
и вот еще ошибку временами выдает... как раз по этой строке, с неинициализированными переменными...
Егор

Егор (статус: 10-ый класс), 20 февраля 2010, 22:15 [#3]:

Цитата (Fox Nick):

ошибку временами выдает

правильно выдаёт - переменная альфа по умолчанию равна нулю. код ДОЛЖЕН выдавать сообщение об ошибке, ибо "Alpha must be >1 and <6"
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Fox Nick

Fox Nick (статус: Посетитель), 20 февраля 2010, 23:10 [#4]:

да но это не самое важное важнее было бы разобратся почему когда ошибок не выдает с картинкой всеравно нечего не происходит... или это
Fox Nick

Fox Nick (статус: Посетитель), 20 февраля 2010, 23:11 [#5]:

из за Alpha...))
Fox Nick

Fox Nick (статус: Посетитель), 20 февраля 2010, 23:14 [#6]:

может есть идеи как все это до ума довести... для начала надо из этого кода все лишнее убрать или понять что зачем нужно...
min@y™

min@y™ (статус: Доктор наук), 21 февраля 2010, 09:41 [#7]:

Имхо, надо сначала разобраться, как работает код, а не тупо копипастить его к себе в программу.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Егор

Егор (статус: 10-ый класс), 21 февраля 2010, 10:29 [#8]:

Цитата (Fox Nick):

понять что зачем нужно

вот это - умная мысль :)
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Fox Nick

Fox Nick (статус: Посетитель), 21 февраля 2010, 12:11 [#9]:

так я подумал мне помогут разобрать его...))

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:57
Выполнено за 0.03 сек.