_Q12_ Ответов: 3

Как создать базовый пакет для хранения изображений ?


Как создать базовый пакет для хранения изображений ? Как почтовый файл. Все, что я хочу, это хранить 20000 изображений внутри одного пакета. Это проще для моего жесткого диска. Кроме того, мне нужно иметь возможность входить и выходить из этого пакета, читать/писать , добавлять или удалять файлы, используя код c#. Другой формат файла -. iso, который близок к тому, что я хочу, но с ним сложно работать. Я хочу что-то очень простое, не сложное. Базовый как библиотека, если это возможно. Существует ли такая вещь? Спасибо!

Что я уже пробовал:

не имеет значения в данной ситуации.

3 Ответов

Рейтинг:
10

_Q12_

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

Я нахожу практическое решение, но не настолько эффективное, как мне хотелось бы.
Движется медленно при циклическом циклировании изображений из zip-файла, потому что он распаковывает каждое из них. Я должен переосмыслить код и распаковать все в поток или несколько списков. Я посмотрю. На данный момент это работает, и я очень счастлив :)

Вот к какому результату я пришел:


//My code so far - not very efficient but is working.
using Ionic.Zip;
using Ionic.Zlib;

        string zipPath = "0Images.zip";
        void CountZipFiles()
        {
            using (ZipFile zip = new ZipFile(zipPath))
            {
                totalzipFiles = zip.Count-1;
            }
        }
        Image emptyImage = Image.FromFile("emptyFemale.jpg");
        void ReadZipImage()
        {
            using (ZipFile zip = new ZipFile(zipPath))
            {
                MemoryStream tempS = new MemoryStream();
                for (int i = 0; i < zip.Count; i++)
                {
                    if (i == countMyZipImages)
                    {
                        label1.Text = zip[i].FileName;
                        if (zip[i].FileName.Contains(".niet"))
                        {
                            pictureBox1.Image = emptyImage;
                        }
                        else
                        {
                            zip[i].Extract(tempS);
                            pictureBox1.Image = Image.FromStream(tempS);
                        }
                    }
                }
            }
        }

        int totalzipFiles = 0, countMyZipImages = 0;
        private void button2_Click(object sender, EventArgs e)
        {
            countMyZipImages--;
            if (countMyZipImages < 0) countMyZipImages = totalzipFiles;
            textBox1.Text = countMyZipImages.ToString();
            ReadZipImage();
        }
        private void button3_Click(object sender, EventArgs e)
        {
            countMyZipImages++;
            if (countMyZipImages > totalzipFiles) countMyZipImages = 0;
            textBox1.Text = countMyZipImages.ToString();
            ReadZipImage();
        }



// and this is a HELP file for later use - hopefully will help others too. ;)

How to add Ionic.Zip.dll in c#.net project and use it:

To add a reference, right click (in Solution Explorer on your project) Reference folder and select Add Reference.
Then browse and add the file Ionic.Zip.dll

//Important to add this using's too after referencing.
using Ionic.Zip;
using Ionic.Zlib;


        private void CreateZIP_Click(object sender, EventArgs e)
        {
            using (ZipFile zip = new ZipFile())
            {
                // add this map file into the "images" directory in the zip archive
                zip.AddFile("c:\\images\\personal\\7440-N49th.png", "images");
                // add the report into a different directory named "files" in the archive
                zip.AddFile("c:\\Reports\\2008-Regional-Sales-Report.pdf", "files");
                zip.AddFile("ReadMe.txt");
                zip.Save("MyZipFile.zip");
                
                Exception ex = new Exception();
                label1.Text = ex.Message;
            }
        }


		//You can extract to a stream, or a fizical file ! 
        private void button5_Click(object sender, EventArgs e)
        {
            using (ZipFile zip = new ZipFile("0Images.zip"))
            {
                MemoryStream tempS = new MemoryStream(); //stream
                
          //{      
                foreach (ZipEntry ze in zip)		//foreach
                {
                    // check if you want to extract the image.name 
                    if (ze.FileName == "00002 Riley Reid.jpg")
                    {
                        ze.Extract(tempS);
                        pictureBox1.Image = Image.FromStream(tempS);
                    }
                }
           //OR
                for (int i = 0; i < zip.Count; i++)	//for
                {
                    if (i == countMyZipImages)
                    {
                        zip[i].Extract(tempS);
                        pictureBox1.Image = Image.FromStream(tempS);
                    }
                }
           //}     
                
            }
        }


Это бесплатная библиотека, которую я нахожу в интернете! Мне это нравится, потому что очень мало - 435кб. Вот ссылка, которую я нахожу для других, если они хотят ее использовать. Dropbox - Ionic.Zip.dll[^]


BillWoodruff

Есть ли какой-нибудь способ предсказать, какие изображения вам нужно будет распаковать и кэшировать их ?

_Q12_

Биллу Вудраффу: "я не очень уверен, что вы имеете в виду, когда говорите "предсказать"; но мой следующий шаг-сделать несколько страниц, вероятно, с 30 img на страницу. Помните, что у меня есть 12000 или около того изображений(у меня было 20000).Надеюсь, я смогу показать (30)их мгновенно и без какой-либо задержки (как у меня сейчас). Я, вероятно, распакую весь этот zip-файл в поток памяти и сохраню их в списках изображений. Вот о чем я сейчас думаю. Я посмотрю, что будет с КК после этих переговоров. И, вероятно, я обновлю свой ответ.

BillWoodruff

Под "предсказанием" я подразумеваю знание, с помощью некоторых средств, к каким 30 картинкам вы хотите получить доступ в следующий момент времени.

Я думаю, что вы должны обратить пристальное внимание на Совет Ричарда Маккатчана: папки дешевы; файловая система быстра.

Помните, что файлы изображений уже сжаты,
'в формате JPEG lossily, .нет-потери ПНГ; маленькие, как правило, есть свободное место сохраняется за счет дальнейшего сжатия их.

Richard MacCutchan

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

_Q12_

to Richard MacCutchan>> What you say is very good and normal for 100 files. But for more than 10000, ugh... My point, that is not that clear, is very simple. When I usually perform a search on my hdd, manual search to find something, semi-automatic search to calculate the size of stuff, antivirus searches, and in general anything that is searching, (ehem, viruses also)... I/them have a long time iterating through all that scrap of 10000files that is not relevant for the search itself, and is freeze there for some time to do it's business properly. This is not a good job at all in my eyes. I like stuff to be neat and efficient. It's how I like it. And also I learn new stuff in the way. I hope it makes sense now for you. If not, dont hesitate to ask me. I am all open source here. :)

Richard MacCutchan

Независимо от того, храните ли вы эти файлы в zip-архиве или файловой системе, поиск по 10 000 файлам будет одной и той же проблемой. И как я предложил, Вы можете создать небольшую базу данных или что-то подобное в качестве индекса в вашей коллекции.

_Q12_

Ричарду Маккатчану > & gt;
Когда 10000 файлов остаются свободными на жестком диске,в папке, поиск страшно пройти по ним, что-то вроде 2 минут. Когда у меня есть только 1 отдельный zip-файл, поиск будет проходить по нему в 10us. Вот в чем разница. Я никогда не работал ни с базами данных, ни с чем подобным (что похоже на базу данных?). Я понятия не имею, что означает индекс в моей коллекции. Так жаль. Я обычно делаю свою собственную базу данных, которая представляет собой файл *.txt, в котором я сохраняю некоторые настройки, некоторые результаты после вычислений, информацию, которую я извлекаю из большого текста - например, из html-страниц. Это все, что я использую для базы данных.

_Q12_

к мистеру Биллвудраффу, повторяю, я использую zip не для сжатия, а для хранения.
Как маленькая коробочка.

BillWoodruff

используете ли Вы информацию/теги EXIF для организации изображений ? является ли выбор #30 для показа всегда случайным ?

весь архив изображений копируется на компьютере каждого пользователя ... или доступ к нему осуществляется с центрального сервера ?

_Q12_

Биллу Вудраффу: Ну, то, о чем вы сейчас спрашиваете, - это логистическая проблема. Я сделал простую для доступа файловую систему. Мои изображения переименованы из его первоначальных имен в: 00000 SDaniels.jpg; 00001 GiaK.jpg; ...12363 PoizonF.jpg; 12364 Alessandrea.niet (конец файлов). (.niet = нет изображения, и я использую изображение по умолчанию). Код, который включает в себя все изображения, чрезвычайно прост. Я еще не сделал этого, я сделаю это достаточно скоро - но с моей верхней части головы я, скорее всего, сделаю инструкцию i = page*30 и получу изображение i из списка "изображение". Вот и все. :)
И чтобы ответить на ваши вопросы:
-Нет, я не знаю, как использовать информацию EXIF/теги для организации изображений.
-Выбор #30 для показа всегда случайный? -Это фиксированное число, которое я выбираю, в зависимости от того, сколько картинок на странице Я хочу разместить и насколько хорошо они стоят рядом друг с другом, используя пробелы, границы и т. д.
- это простой zip-файл, который можно транспортировать куда угодно, так что да, он может быть реплицирован где угодно. Я не знаю, как пользоваться серверами.

BillWoodruff

Если отображаемые изображения выбраны случайным образом, это одно; если они выбраны на основе поведения пользователя, предпочтений или выбора, это другое.

Во втором случае вы можете. возможно, оптимизировать стратегию загрузки.

Удачи, я иду дальше, чтобы помочь другим людям.

Рейтинг:
1

BillWoodruff

Используйте класс ZipArchive в System.IO.Compression, доступный в .NET 4.5: [^].

Create a zip archive from a directory
ZipFile.CreateFromDirectory

Extract the contents of a zip archive to a directory
ZipFile.ExtractToDirectory

Add new files to an existing zip archive
ZipArchive.CreateEntry

Retrieve a file from a zip archive
ZipArchive.GetEntry

ZipArchive.Entries
Retrieve all the files from a zip archive

ZipArchiveEntry.Open
Open a stream to a single file contained in a zip archive

ZipArchiveEntry.Delete
Delete a file from a zip archive


_Q12_

Биллу Вудраффу-спасибо за ваше милое объяснение - Я хочу, чтобы все постили так же, как вы. Серьезно.
-Мне нравится ваш: << ZipArchiveEntry.Open
Откройте поток в один файл, содержащийся в zip-архиве>>

Еще одна проблема: у меня есть .Net 4.0, и я работаю с MVS 2010.
У меня есть "System.IO.Compression", но класс ZipArchive не существует в этой версии .Net 4.
Я уже пробовал с этим Ionic.Zip.dll но я не понимаю, как открыть поток внутри этой библиотеки (например, ZipArchiveEntry.Открытый пример).
Большое вам спасибо за ваш очень хороший пример кода !!!

BillWoodruff

Можете ли вы переключиться на .NET 4.5 ? Это не сломает ваш текущий код. Я не знаком с Ionic, но есть много библиотек сжатия с открытым исходным кодом ... проверьте GitHub.

_Q12_

I can not switch to 4.5 unfortunately.Here are the reasons: My hardware is not that performant. I did install MVS 2017? or something, that was updating itself from internet!, and had some funky business to it that i didnt care less. I had some serious problems using that newer version - i dont recall what it was exactly, but it was something horrible - i almost had to reinstall windows because of it.. i didnt in the end. So I back down to oldie but goldie. I like new shiny software, but I like more the practical and working ones. Also tested by time. Maybe i'm an idiot, but is working fine with what hardware and OS configuration I have. I learned to not stretch more than what I have. :P
Эту библиотеку я нашел некоторое время назад, но у меня никогда не было на нее времени, она мне очень нравится, потому что ее очень маленький размер - 435 КБ, а также можно бесплатно скачать из интернета! Я посмотрю на github, как вы предлагаете, и благодарю вас за то, что вы направили меня к нему. Мне любопытно, насколько они малы и эффективны из github.

BillWoodruff

По моему опыту: на данный момент .NET 4.5 очень стабилен, как и VS 2017.

Проверьте новое сжатие ' Brotli от Google,

https://github.com/google/brotli

и, конечно же, 7-zip.

Помните, что файлы изображений уже сжаты,
- jpeg с потерями, png без потерь; как правило, при дальнейшем сжатии остается мало места.

_Q12_

Спасибо, мистер Биллвудрафф, я изучу эти новые методы сжатия. Новый для меня. Я никогда не слышал об этом бротти, и спасибо вам, что нашли время поместить здесь ссылку на него. Очень милый.
Опять же, я использую zip не для сжатия, а для хранения.
Как маленькая коробочка.

Рейтинг:
0

Richard MacCutchan

Вы можете создавать zip-файлы и управлять ими в .NET, см. Класс ZipFile (System.IO.Compression)[^].


_Q12_

Я уже пробовал zip-файлы. Я хочу чего-то более простого, чем это. Более простой, если это возможно. Архивирование не требуется, только хранение. Как коробка !!!

Richard MacCutchan

У вас она уже есть, она называется файловой системой.