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

Вниз

Рисунки в директории   Найти похожие ветки 

 
XRMiPO   (2007-07-21 12:40) [0]

Подскажите, как сделать, чтобы в компоненте ShellListView или подобном, можно было отобразить уменьшенные копии рисунков в директории, как в проводнике.


 
Dib@zol ©   (2007-07-21 12:48) [1]

Уууу... Эт надо сначала загружать все рисунки, потом их уменьшать до нужного размера, желательно при этом ресэмплируя, а уже потом их выводить... С VCL-уровнем быстродействие выше чем 10 рис/сек тебе не светит. Тут АСМ нужен...


 
Dib@zol ©   (2007-07-21 12:52) [2]

Хотя в принципе можно проделать следующий финт ушами: В каждой папке где есть рисунки, практически всегда найдётся файл Thumbs.db, и если знать его структуру, то можно открыть уже готовые уменьшенные копии. Только эта самая структура мне неизвестна :(


 
XRMiPO   (2007-07-21 12:58) [3]

нашел, про структуру thumbs.db, правда мне ето неочень понятно)

Вообще это Structured Storage (см. MSDN), в котором есть индексный файл и файлы с маленькими жпегами (эскизами). Формат индексного файла, если не ошибаюсь, следующий:
Заголовок:
4 байта - всегда 0x00070010 (номер версии 7.10 скорее всего)
4 байта - число изображений
4 байта - ширина эскиза
4 байта - высота эскиза
Для каждого эскиза:
4 байта - длина данной записи включая это поле
4 байта - номер (имя) файла с эскизом
8 байт - дата/время файла (для контроля за изменениями) изображения
N байт - имя файла в юникоде.


 
Dib@zol ©   (2007-07-21 13:01) [4]

Ну и чего??? Читай через CreateFile/ReadFile!


 
XRMiPO   (2007-07-21 13:04) [5]

поподробней можно?)


 
Dib@zol ©   (2007-07-21 14:25) [6]

Ага.

procedure ReadDBFile(Name:string);
var
 F : HFILE;
 P : Pointer;
 S, K, B : Cardinal;
// ------------------------------------------------------- \\
procedure CopyMem(var Buf; shift, size:Cardinal);
begin
Move(pointer(cardinal(p)+shift)^, Buf, size);
end;
// ------------------------------------------------------- \\
begin
 F:=CreateFile(PChar(Name), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
 S:=GetFileSize(F, nil);
 GetMem(P, S);
 ReadFile(F, P, S, K, nil);
 K:=0;

 K:=4; // Пример
 CopyMem(B, K, SIZEOF(B)); // Пример

 FreeMem(P);
 CloseHandle(F);
end;

Вот процедура, наспех мною накорябанная. В "K" прописываешь смещение относительно начала файла, в байтах. Вызываешь CopyMem как показано ("B" не обязательно должно быть Cardinal) и читаешь, читаешь... Пока не наступит просветление :)


 
XRMiPO   (2007-07-22 10:56) [7]

Вроде все работает, только я же незнаю, как это дело использовать, для того, чтобы отобразить эти эскизы в ShellListView или подобном



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

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

Наверх




Память: 0.46 MB
Время: 0.053 c
2-1185540202
delphiuser1
2007-07-27 16:43
2007.08.19
const при передаче в функцию/процедуру.


2-1185136869
ReW
2007-07-23 00:41
2007.08.19
Цветовой Ключ


1-1181652993
Tab
2007-06-12 16:56
2007.08.19
координаты x и y при начале Drag n Drop


15-1185194503
StriderMan
2007-07-23 16:41
2007.08.19
GPS: встроенный vs внешний


1-1180368669
Dmitry_177
2007-05-28 20:11
2007.08.19
Перехват клавиатуры





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский