Есть ли способ быстро изменить размер JPEG в 1/8 от его первоначального размера в .NET? - PullRequest
2 голосов
/ 22 января 2009

И, надеюсь, с минимальными потерями, насколько это возможно, я слышал о реализации, предложенной парнем по имени Гвидо Воллбединг. Стандартный GDI +, похоже, не имеет такой возможности, и все, что я нашел до сих пор, это либо спецификации, либо полностью интегрированные инструменты. Тонкий, подключаемый компонент .NET был бы весьма желателен. Какие распространенные подводные камни, если речь идет о том, что я сам это реализовал?

Все идеи и рекомендации приветствуются!

РЕДАКТИРОВАТЬ : Моя цель состоит в том, чтобы обойти очевидный цикл распаковки в .NET Bitmap, изменения его размера и последующего сжатия. Эта статья , кажется, указывает на правильный путь, но до сих пор я никогда не видел никакой реализации .NET

Ответы [ 3 ]

2 голосов
/ 22 января 2009

Это довольно легко, используя класс .NET Bitmap:

void ResizeImage(string inFname, string outFname, float scale)
{
    Bitmap bmpOrig = new Bitmap(inFname);
    int w = (int)(scale * bmpOrig.Width);
    int h = (int)(scale * bmpOrig.Height);
    Bitmap bmpNew = new Bitmap(bmpOrig, new Size(w, h));
    bmpNew.Save(outFname, ImageFormat.Jpeg);
}

Вам необходимо добавить ссылку на System.Drawing и использовать в коде как System.Drawing, так и System.Drawing.Imaging:

Я не могу сказать, сколько потерь будет.

0 голосов
/ 11 мая 2011

Загрузите его в память как растровое изображение, затем получите его данные и используйте небезопасный код, написанный как C ++, чтобы изменить его размер. Здесь , где я узнал, как быстро изменить размер изображений (я не думаю, что ссылка изменяет их размер, но он показывает вам, как писать код быстрой обработки изображений в .Net)

Установка точки останова и пошаговое выполнение кода в окне «Разборка» подскажет вам, как вы работаете. Избегайте любого доступа к массиву, просто используйте указатели, доступ к массиву - это смертельный удар для узких циклов производительности в .Net (потому что есть проверка того, находится ли индекс в пределах границ, а затем условный переход, чтобы вызвать исключение для Every. . Доступ.)

0 голосов
/ 22 января 2009

Я не знаю ни одного алгоритма, который бы конкретно обрабатывал 1 / (2 ^ n), но если вы сможете найти его, вам нужно будет иметь возможность блокировать биты на битовой карте (если вы хотите какую-либо разумную форму скорости ). Использование set / get pixel - плохая идея.

Clickety

...