Изготовление виньеток алгоритма эффекта изображений с.NET

Я хотел бы знать, как я создаю эффект изготовления виньеток на изображение с помощью C# и.NET.

У кого-либо есть какие-либо идеи, как сделать это? Или есть ли какие-либо ресурсы, которым сделают алгоритм уже для меня?

6
задан George Stocker 14 January 2010 в 18:30
поделиться

2 ответа

Тестовая рамка shoulda имеет отличную помощницу, которая позволяет утверждать определенные условия относительно электронного письма, которое было sent. Да, вы могли бы сделать это самостоятельно с ActionMailer.deliveries, но shoulda делает все это один аккуратный маленький блок

-121--1110401-

Используя подход Эндрю , приведем пример воспроизведения равной закаленной шкалы .

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;

public class Tone {

    public static void main(String[] args) throws LineUnavailableException {
        final AudioFormat af =
            new AudioFormat(Note.SAMPLE_RATE, 8, 1, true, true);
        SourceDataLine line = AudioSystem.getSourceDataLine(af);
        line.open(af, Note.SAMPLE_RATE);
        line.start();
        for  (Note n : Note.values()) {
            play(line, n, 500);
            play(line, Note.REST, 10);
        }
        line.drain();
        line.close();
    }

    private static void play(SourceDataLine line, Note note, int ms) {
        ms = Math.min(ms, Note.SECONDS * 1000);
        int length = Note.SAMPLE_RATE * ms / 1000;
        int count = line.write(note.data(), 0, length);
    }
}

enum Note {

    REST, A4, A4$, B4, C4, C4$, D4, D4$, E4, F4, F4$, G4, G4$, A5;
    public static final int SAMPLE_RATE = 16 * 1024; // ~16KHz
    public static final int SECONDS = 2;
    private byte[] sin = new byte[SECONDS * SAMPLE_RATE];

    Note() {
        int n = this.ordinal();
        if (n > 0) {
            double exp = ((double) n - 1) / 12d;
            double f = 440d * Math.pow(2d, exp);
            for (int i = 0; i < sin.length; i++) {
                double period = (double)SAMPLE_RATE / f;
                double angle = 2.0 * Math.PI * i / period;
                sin[i] = (byte)(Math.sin(angle) * 127f);
            }
        }
    }

    public byte[] data() {
        return sin;
    }
}

Этот низкоуровневый подход может подходить для более старых, менее способных платформ. Также рассмотрим javax.sound.midi ; полный пример показан здесь , а руководство по синтезированию звука приведено здесь .

-121--2296630-

Я верю, что это сделает то, что вы хотите:

public void PaintVignette(Graphics g, Rectangle bounds)
{
    Rectangle ellipsebounds = bounds;
    ellipsebounds.Offset(-ellipsebounds.X, -ellipsebounds.Y);
    int x = ellipsebounds.Width - (int)Math.Round(.70712 * ellipsebounds.Width);
    int y = ellipsebounds.Height - (int)Math.Round(.70712 * ellipsebounds.Height);
    ellipsebounds.Inflate(x, y);

    using (GraphicsPath path = new GraphicsPath())
    {
        path.AddEllipse(ellipsebounds);
        using (PathGradientBrush brush = new PathGradientBrush(path))
        {
            brush.WrapMode = WrapMode.Tile;
            brush.CenterColor = Color.FromArgb(0, 0, 0, 0);
            brush.SurroundColors = new Color[] { Color.FromArgb(255, 0, 0, 0) };
            Blend blend = new Blend();
            blend.Positions = new float[] { 0.0f, 0.2f, 0.4f, 0.6f, 0.8f, 1.0F };
            blend.Factors = new float[] { 0.0f, 0.5f, 1f, 1f, 1.0f, 1.0f };
            brush.Blend = blend;
            Region oldClip = g.Clip;
            g.Clip = new Region(bounds);
            g.FillRectangle(brush, ellipsebounds);
            g.Clip = oldClip;
        }
    }
}

public Bitmap Vignette(Bitmap b)
{
    Bitmap final = new Bitmap(b);
    using (Graphics g = Graphics.FromImage(final)) {
        PaintVignette(g, new Rectangle(0, 0, final.Width, final.Height));
        return final;
    }
}

Что здесь происходит? Сначала я написал код, который заполнял прямоугольник эллиптической градиентной кистью, которая переходила от белого к черному. Затем я изменил код так, чтобы заполненная область также включала углы. Я сделал это, увеличив размер прямоугольника на разницу между размерами прямоугольника и sqrt (2 )/2 * размерами прямоугольника.

Почему sqrt (2 )/2? Поскольку точка (sqrt (2 )/2, sqrt (2 )/2) является точкой угла 45 градусов на единичной окружности. Масштабирование по ширине и высоте дает расстояние, необходимое для раздувания ректа, чтобы убедиться, что он полностью покрыт.

Затем я настроил смесь градиента на гораздо более белый в центре.

Затем я изменил цвет с белого на чистый прозрачный черный и с черного на чистый непрозрачный черный. Это дает эффект картины дальних углов в черный цвет и затенения меньше на пути к центру.

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

10
ответ дан 9 December 2019 в 20:43
поделиться

No. После завершения просить PHP все ресурсы будут освобождены, включая ресурсы подключения MySQL.

-121--3460700-

Еще одним вариантом было бы создание новой конфигурации в Visual Studio помимо отладки и выпуска.... возможно, Debug32 и Debug64 и т.д. Одним из параметров настройки конфигурации является архитектура ЦП.

Затем в постобъектах Проекта можно сделать старомодное утверждение if/else, используя макрос имени платформы в качестве условия...

Если имя платформы использовалось в качестве подкаталога в решении, в котором хранилась неуправляемая библиотека DLL, можно скопировать из каталога с использованием имени платформы в каталог bin.

-121--4349626-

Если ваш картинный находится в файле, и если это достаточно быстро для ваших требований, вы можете использовать инструмент командной строки конвертировать из ImageMagick , он имеет опцию -vignette . Чтобы вызвать его из программы C #, можно запустить его через System.Diagnostics.Process.Start или использовать эту оболочку .NET для ImageMagick.

2
ответ дан 9 December 2019 в 20:43
поделиться
Другие вопросы по тегам:

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