Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.10.12;
Скачать: CL | DM;

Вниз

помогите найти косяк   Найти похожие ветки 

 
Вова   (2013-10-24 00:34) [0]

TSimpleSearchArray = array of word;

Вообщем первая процедура  берет бмп в котором только белые и черные точки, и копируем его в одномерный массив, в котором сохраняем только смещения относительно x=0 для черных точек. А окончание строки помечено числом High(xmin). Также в первом элементе массива сохраняем ширину строки, во втором высоту колонки, попутно обрезая незначащие строки и колонки по краям картинки (т.е. в восстановленной картинке пустых строк и колонок по краям быть не должно)


function ScanLineArray(SearchingBmp: Tbitmap;
 var searchArray: TSimpleSearchArray): boolean;
var
 x, xmin, xmax: word;
 ymin,ymax, y: word;
 i: integer;
 Start, Stop: pInteger;
begin
 result := false;
 if SearchingBmp = nil then
   exit;

 if (SearchingBmp.Height > 0) then
 begin

   Start := SearchingBmp.ScanLine[SearchingBmp.Height - 1];
   Stop := SearchingBmp.ScanLine[0];
   inc(Stop, SearchingBmp.Width);

   // сначала найдем 0.0, т.к. в шаблоне могут быть пустые строки и колонки,
   // то вычисляем минимальные x и y для непустой строки и колонки

   x := 0;
   xmax := 0;
   ymax := 0;
   xmin := High(xmin);
   y := 0;
   ymin := High(ymin);
   repeat
     if Byte(Start^) = 0 then
     begin
       if xmin > x then
         xmin := x;
       if ymin > y then
         ymin := y;
       if xmax < x then
         xmax := x;
       if ymax < y then
         ymax := y;
     end;
     inc(x);
     inc(Start);
     if x > (SearchingBmp.Width - 1) then
     begin
       x := 0;
       inc(y);
     end;
   until Start = Stop;
   if xmax = 0 then
   begin
     SearchingBmp.free;
     exit;
   end;

   Start := SearchingBmp.ScanLine[SearchingBmp.Height - 1];
   // восстанавливаем старт
   // и переводим его в 0.0
   inc(Start, (xmin + ymin * SearchingBmp.Width));
   SetLength(searchArray, 2);
   searchArray[0] := xmax - xmin + 1;  // в первую ячейку мы запишем реальную ширину шаблона
   searchArray[1] := ymax - ymin + 1;  // а во вторую мы запишем реальную высоту шаблона

   // строим шаблон
   x := 0;
   i := 1;
   repeat
     if Byte(Start^) = 0 then
     begin
       inc(i);
       SetLength(searchArray, i + 1);
       searchArray[i] := x;
     end;
     inc(Start);
     inc(x);
     if x > (searchArray[0] - 1) then
     begin
       x := 0;
       inc(i);
       SetLength(searchArray, i+1);
       searchArray[i] := High(searchArray[i]);//пометка о конце строки
     end;
   until Start = Stop;

   result := true;
 end;
 SearchingBmp.free;
end;



А во второй процедуре я пытаюсь получить исходный рисунок из массива полученного в предыдущей процедуре, а получаю какую то фигню.

Procedure Restore(bufX : TSimpleSearchArray);
var
tbmp :TBitmap;
 i: integer;
 Start,p: pInteger;
 x: word;
 y: word;
begin

 tbmp := Tbitmap.Create;
 tbmp.PixelFormat := pf32bit;
 tbmp.Width := bufX[0];
 tbmp.Height:= bufX[1];

 Start := tbmp.ScanLine[tbmp.Height-1];
 p:= Start;
 
 i:=2;
 y:=0;
 x:=0;
 repeat
   if bufX[i] = High(bufX[i]) then //если мы наткнулись на перевод строки, то и переводим ее
   begin
     inc(y);//т.е. добавляем Y
     inc(i);
     continue;
   end;

   inc(p,y*bufX[0] + bufX[i]);
   p^ := 0;
   p  := Start;

   inc(i);
 until y = (bufX[1]-1);

 tbmp.SaveToFile("C:\3.bmp");

end;


Где косяк?


 
Туповатый ©   (2013-10-24 03:40) [1]


> помогите найти косяк

чтобы биться головой? скурить? сделать консервы?


 
Cobalt ©   (2013-10-24 11:51) [2]

Возьми листок бумаги.
Напиши исходные данные
Напиши результат, который должен получиться для них.

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


 
Вова   (2013-10-24 12:18) [3]

таки я уже это все делал, но когда я проверяю на картинке в 4 пикселя все ок. Но когда берем большую картинку, на которой например круг, в итоге получаем кучу каких то полукругов, хотя вроде как больше 2х быть не должно. Я уже 2 дня втыкаю в этот код, ничего не втыкается(


 
Вова   (2013-10-24 12:27) [4]

10
01

Где 1 - черный, т.е. со значением цвета 0.

причем вот в такой картинке
Start := tbmp.ScanLine[tbmp.Height-1];  вроде как должен указывать на нижнюю единицу, но вместо этого там не 0 совсем, а ноль только после inc(Start), т.е. в левом нижнем углу. Похоже я опять что то не могу понять в этих битмапах.


 
Вова   (2013-10-24 12:28) [5]

ой....АААА он указывает на верхний правый ноль ) во....


 
Вова   (2013-10-24 22:44) [6]

оказалось, что в этом коде ошибок нет существенных :-D т.к. если грузить из картинки на диске, то все нормально восстанавливается. а вот если из блоба, то шляпа. Вот так я засовываю и высовываю из  блоба. Что не так то? (

  vBlob := ClientDataSet3.CreateBlobStream
         (Form3.ClientDataSet3.FieldByName("massSample"), bmWrite);
       vBlob.Seek(0, soFromBeginning);
       vBlob.WriteBuffer(searchArray[0], Length(searchArray) * SizeOf(searchArray[0]));
       vBlob.free;


 vBlob := ClientDataSet3.CreateBlobStream
   (ClientDataSet3.FieldByName("massSample"), bmRead);
   TempL := trunc(vBlob.Size/sizeof(word));
   SetLength(bufX,TempL);
 try
   vBlob.Seek(0, soFromBeginning); // sереход в начало потока BLOB
   SizeL := vBlob.Size;
   vBlob.ReadBuffer(bufX[0],SizeL);
 finally
   vBlob.free;
 end;
 if SizeL= 0 then
   exit;


 
Вова   (2013-10-25 02:38) [7]

все....помог себе сам.


 
Inovet ©   (2013-10-25 13:28) [8]

> [3] Вова   (24.10.13 12:18)
> Я уже 2 дня втыкаю в этот код, ничего не втыкается

Так код, значит, скопипастченыей.


 
Вова   (2013-10-25 14:03) [9]

хм, видимо я уже профи, если пишу код похожий на скопипастенный )


 
Туповатый ©   (2013-10-25 14:53) [10]

Ошибаешься. Дважды. Inovet имел ввиду, что раз ты не понимаешь, что написал, значит, это не ты писал. И он прав.


 
Вова   (2013-10-25 15:13) [11]

пруф, что не я писал или платите за моральный ущерб.


 
Вова   (2013-10-25 15:14) [12]

я сказал, что ошибку не могу найти, а не то, что я не понимаю, что написал.


 
Вова   (2013-10-25 15:15) [13]

ну и это, раз вы себя так плохо вели, не скажу вам где тут косяки )


 
Туповатый ©   (2013-10-25 15:19) [14]


> я сказал, что ошибку не могу найти, а не то, что я не понимаю,
>  что написал.

Ну, это как-то не состыковывается. Либо понимаешь и видишь ошибку, либо не видишь ошибку, а значит - не понимаешь, хоть и думаешь наоборот.


> не скажу вам где тут косяки )

да, это правильно. так мне и надо. пойду, брошусь под поезд.


 
Вова   (2013-10-27 12:26) [15]

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


 
Юрий Зотов ©   (2013-10-27 20:13) [16]

> Вова   (27.10.13 12:26) [15]

http://www.kostyor.ru/poetry/krylov/?n=12


 
Inovet ©   (2013-10-28 06:32) [17]

> [16] Юрий Зотов ©   (27.10.13 20:13)

Или по-современному - пора сменить прокладку.


 
Вова   (2013-10-28 10:43) [18]

не по современному, вы терпилы


 
[ВладОшин] ©   (2013-10-28 10:57) [19]


> нет ничего глючней и неудобней в этом мире, чем отладчик
> делфи

оппа,
так еще никто не говорил.. :)


> вы терпилы

Известных значений у этого слова 2
1. Криминальный. Кто молча сносит наезды
--2. Ментовской (зачеркнуто) Полицейский(зачеркнуто)  (зачеркнуто все) --
1.2.Второй криминальный.  Потерпевший в результате преступления.

Вы какой имели ввиду?


 
Юрий Зотов ©   (2013-10-28 12:39) [20]

> Вова   (28.10.13 10:43) [18]

А что терпеть-то? Терпеть нечего - таких проблем просто не возникает. Похоже, Иван Андреевич все же прав.


 
Вова   (2013-10-28 13:30) [21]

xe2, тратить время на создание видео желания нет, но готов изготовить ролик за ваш счет.


 
Туповатый ©   (2013-10-28 13:51) [22]

чем дебильней, тем самомненительней...


 
Inovet ©   (2013-10-28 13:51) [23]

Может, во время отладки отключать оптимизации надо, прежде чем говорить о глюках? Как отладчик покажет то, чего после оптимизации может и не быть, или оно будет в другом месте.


 
Anatoly Podgoretsky ©   (2013-10-28 13:57) [24]


> xe2, тратить время на создание видео желания нет, но готов
> изготовить ролик за ваш счет.

Теперь стоимость увеличивается вдвое.


 
Юрий Зотов ©   (2013-10-28 15:51) [25]

> Вова   (27.10.13 12:26) [15]

1. Отключите оптимизацию.

2. Включите отладочную информацию и настройте пути к исходникам.

3. Еще на этапе отладки полезно включить контроль переполнения и выхода за диапазон.

4. Перебилдите проект (Build, не Compile).


 
Sapersky   (2013-10-28 16:09) [26]

И отладочный режим FastMM, он в логе пишет, если были выходы за границу блока памяти (header/footer corrupted).


 
Юрий Зотов ©   (2013-10-28 16:11) [27]

> Вова   (27.10.13 12:26) [15]

Да - еще перед билдом убедитесь в том, что исходники и DCU у Вас в единственном экземпляре.


 
[ВладОшин] ©   (2013-10-28 16:22) [28]


> убедитесь в том, что исходники и DCU у Вас в единственном
> экземпляре.


???
не понял..


 
Юрий Зотов ©   (2013-10-28 16:37) [29]

> [ВладОшин] ©   (28.10.13 16:22) [28]

Например, в IDE открыт один MyUnit.pas, а в проект включен другой MyUnit.pas.



Страницы: 1 вся ветка

Текущий архив: 2014.10.12;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.008 c
15-1393932699
ТНЕ картман
2014-03-04 15:31
2014.10.12
структура?


15-1393878602
Юрий
2014-03-04 00:30
2014.10.12
С днем рождения ! 4 марта 2014 вторник


15-1393593127
ТимоховДА
2014-02-28 17:12
2014.10.12
If (YouLoveVCL = true) then TReadThisNow.Create();


2-1382846989
Серёжка программист
2013-10-27 08:09
2014.10.12
XML


15-1393867151
Дмитрий СС
2014-03-03 21:19
2014.10.12
html5 для мобил и планшетов.