все доброго времени суток. назрел один вопрос не могу никак решить.
есть набор жыпегов около 150 тысяч нужно среди них вычленить дубликаты
делаю это так сканирую каталоги, имена картинок сливаю в текстовый файл затем этот файл загружаю в стринглист.
начинаю перебирать эти файлики:
открываю джипегимиджем картинку,
отрисовываю ее стретчдравом на BMP 100х100 пикселов
формирую по этой BMP-шке некую хешсумму
и сливаю ее в файл в формате имя файла картинки,хеш сумма
все просто как трусы
type
thash=array[0..99] of trgb;
pitem=^titem;
titem=object
name:pshortstring;
hash:thash;
constructor init;
procedure loadfromfile(var f:file);
procedure savetofile(var f:file);
function getrgb(i:integer):string;
procedure showhash(cnv:tcanvas;x,y:integer);
destructor destroy;
procedure find(ls:tstringlist);
procedure setname(s:shortstring);
end;
вот собственно проблемный код
bb:=tbitmap.Create;
bb.Width:=100;
bb.height:=100;
for i:=0 to ls.Count-1 do begin
s:=ls[i];if s='' then continue;
inc(j);
if th.count=10 then th.push_to_disk('c:\temp\listfiles.hash');
pic:=nil;
if pos('.JPG',s)=length(s)-3 then pic:=tjpegimage.create;
if pos('.JPEG',s)=length(s)-4 then pic:=tjpegimage.create;
if pos('.BMP',s)=length(s)-3 then pic:=tbitmap.create;
if pic=nil then continue;
pp:=new(pitem,init);
pp^.setname(s);
pic.LoadFromFile(s);
bb.canvas.stretchdraw(rect(0,0,100,100),pic);
pic.Free;
hashpic(bb,pp^.hash);
th.additems(pp);
stb.Panels[0].Text:=inttostr(i)+':'+inttostr(j);
stb.repaint;
end;
проблема вот в чем
при отрисовке некоторых жипегов стречдравом программа вылетает
я не могу понять почему, эта картинка прекрасно открывается в любом вюере, ну там фарстоне или любым другим.
причем я проделал такой опыт: открыл этот файл в гимпе, налисовал на нем точку в один пиксел в уголочке и заново сохранил.
И, о Чудо!, моя программулька его проглотила, но сами понимаете, это не решение проблемы, поскольку порядковый номер эток картинки был после 30 000
какие пути решения вижу я
1. найти более новую версию TJpegImage которая понимает все разновидности жыпегов, но где его найти для 7-й дельфы я не знаю
2 чтобы просто пропускала такой файл
pic.LoadFromFile(s);
try
bb.canvas.stretchdraw(rect(0,0,100,100),pic);
finally
bb.canvas.rectangle(0,0,100,100);
end;
но такая конструкция приводит к завершению программы вне зависимости от того где я ее запускаю из-под делфы или из винды(вопрос из оффтопика try except не помог)
может посоветуете что умное?.
я просто ООООЧЕНЬ давно не кодил, некоторые навыки подрастерял