Я хотел бы знать, как я создаю эффект изготовления виньеток на изображение с помощью C# и.NET.
У кого-либо есть какие-либо идеи, как сделать это? Или есть ли какие-либо ресурсы, которым сделают алгоритм уже для меня?
Тестовая рамка 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
; полный пример показан здесь , а руководство по синтезированию звука приведено здесь .
Я верю, что это сделает то, что вы хотите:
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 градусов на единичной окружности. Масштабирование по ширине и высоте дает расстояние, необходимое для раздувания ректа, чтобы убедиться, что он полностью покрыт.
Затем я настроил смесь градиента на гораздо более белый в центре.
Затем я изменил цвет с белого на чистый прозрачный черный и с черного на чистый непрозрачный черный. Это дает эффект картины дальних углов в черный цвет и затенения меньше на пути к центру.
Наконец, я написал служебный метод, который выполняется на растровом изображении (я не тестировал эту часть - я протестировал код на графике из панели, но я думаю, что он будет работать и здесь.
No. После завершения просить PHP все ресурсы будут освобождены, включая ресурсы подключения MySQL.
-121--3460700-Еще одним вариантом было бы создание новой конфигурации в Visual Studio помимо отладки и выпуска.... возможно, Debug32 и Debug64 и т.д. Одним из параметров настройки конфигурации является архитектура ЦП.
Затем в постобъектах Проекта можно сделать старомодное утверждение if/else, используя макрос имени платформы в качестве условия...
Если имя платформы использовалось в качестве подкаталога в решении, в котором хранилась неуправляемая библиотека DLL, можно скопировать из каталога с использованием имени платформы в каталог bin.
-121--4349626- Если ваш картинный находится в файле, и если это достаточно быстро для ваших требований, вы можете использовать инструмент командной строки конвертировать
из ImageMagick , он имеет опцию -vignette
. Чтобы вызвать его из программы C #, можно запустить его через System.Diagnostics.Process.Start или использовать эту оболочку .NET для ImageMagick.