Как я надежно получаю размеры изображения в.NET, не загружая изображение?

Python и pymongo

Поиск объектов между двумя датами в Python с pymongo в коллекции posts (на основе учебника ):

from_date = datetime.datetime(2010, 12, 31, 12, 30, 30, 125000)
to_date = datetime.datetime(2011, 12, 31, 12, 30, 30, 125000)

for post in posts.find({"date": {"$gte": from_date, "$lt": to_date}}):
    print(post)

Где {"$gte": from_date, "$lt": to_date} указывает диапазон в терминах типов datetime.datetime.

24
задан Simon_Weaver 16 February 2009 в 07:34
поделиться

3 ответа

Можно просто использовать Image.FromStream(Stream, bool, bool) с "ложным" 2-м и 3-м параметром, чтобы не загружать файл в память.

36
ответ дан Styxxy 28 November 2019 в 22:59
поделиться

Если Вы хотите получить размеры изображения (ширина и высоко) с загрузкой изображения, необходимо считать некоторую часть jpeg файла сами как ниже.

Вот из метода поля для Вас :)

public static Size GetJpegImageSize(string filename) {
    FileStream stream=null;
    BinaryReader rdr=null;
    try {
        stream=File.OpenRead(filename);
        rdr=new BinaryReader(stream);
        // keep reading packets until we find one that contains Size info
        for(; ; ) {
            byte code=rdr.ReadByte();
            if(code!=0xFF) throw new ApplicationException(
                    "Unexpected value in file "+filename);
            code=rdr.ReadByte();
            switch(code) {
                // filler byte
                case 0xFF:
                    stream.Position--;
                    break;
                // packets without data
                case 0xD0: case 0xD1: case 0xD2: case 0xD3: case 0xD4: 
                case 0xD5: case 0xD6: case 0xD7: case 0xD8: case 0xD9:
                    break;
                // packets with size information
                case 0xC0: case 0xC1: case 0xC2: case 0xC3:
                case 0xC4: case 0xC5: case 0xC6: case 0xC7:
                case 0xC8: case 0xC9: case 0xCA: case 0xCB:
                case 0xCC: case 0xCD: case 0xCE: case 0xCF:
                    ReadBEUshort(rdr);
                    rdr.ReadByte();
                    ushort h=ReadBEUshort(rdr);
                    ushort w=ReadBEUshort(rdr);
                    return new Size(w, h);
                // irrelevant variable-length packets
                default:
                    int len=ReadBEUshort(rdr);
                    stream.Position+=len-2;
                    break;
            }
        }
    } finally {
        if(rdr!=null) rdr.Close();
        if(stream!=null) stream.Close();
    }
}

private static ushort ReadBEUshort(BinaryReader rdr) {
    ushort hi=rdr.ReadByte();
    hi<<=8;
    ushort lo=rdr.ReadByte();
    return (ushort)(hi|lo);
}

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

11
ответ дан amazedsaint 28 November 2019 в 22:59
поделиться

Выполнение этого обычно включает на самом деле открытие файла и чтение только его заголовок (первые несколько байтов) для нахождения его формата и размера. Вы не должны читать целый файл, чтобы узнать, что это - размер. Иногда размер находится даже в определенном смещении в файле, настолько находящем, что размер только читает 8 байтов.

можно использовать filemon.exe для фактического обнаружения то, что сам Windows Explorer делает для нахождения размера.

3
ответ дан shoosh 28 November 2019 в 22:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: