Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  15:04[Войти] | [Зарегистрироваться]
Ответ на вопрос № 83889

06-07-2024 11:53
все доброго времени суток. назрел один вопрос не могу никак решить.
есть набор жыпегов около 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 не помог)

может посоветуете что умное?.
я просто ООООЧЕНЬ давно не кодил, некоторые навыки подрастерял

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


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

09-07-2024 15:20
Попробуем помочь вашему горю... Только большая просьба - писать на русском языке,
а специальные термины вставлять в оригинале (жипегов=JPG image). Русский язык достаточно богат,
чтобы можно было выразить любое понятие, а иностранные слова... лучше в оригинале. 
Но это так, к слову, надеюсь, я вас не обидел...
Сама идея поиска дубликатов в JPEG изображениях таким способом... может быть, но не забудьте,
что этот формат - сжатие с потерей качества. Точного совпадения по пикселям может и не получиться.
Теперь по делу.

if pos('.JPG',s)=length(s)-3 then pic:=tjpegimage.create;
Так, конечно, можно, но для поиска расширения файла есть специальная функция:
if ExtractFileExt(s)='.JPG' then pic:=tjpegimage.create;

А вместо отрисовки попробуйте Assign.
Вместо
bb.canvas.stretchdraw(rect(0,0,100,100),pic);
попробуйте
bb.Assign(pic);



Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
"Мы с тобой одной крови — ты и я!". Чьи это заветные слова?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

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

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования