ImageMagick создает пустые прозрачные квадраты в зависимости от шириныC#

Место общения программистов C#
Ответить
Anonymous
 ImageMagick создает пустые прозрачные квадраты в зависимости от ширины

Сообщение Anonymous »

Привет всем, я пытаюсь заполнить область пустыми кружками, но получается вот так:
(Уменьшен размер, чтобы не занимать здесь так много места. Исходный размер: 360x1200). Также обратите внимание, что на самом деле я не использую файл Blank.png — он просто существует, чтобы я мог проверить, используется он или нет. Я создаю простой цветной блок в виде «blank.png».
Изображение

Мой код:

Код: Выделить всё

using (MagickImageCollection images = new MagickImageCollection())
{
List lFiles = new List();

lFiles.Add(@"C:\Users\David\Pictures\1.jpg");
lFiles.Add(@"C:\Users\David\Pictures\blank.png");
lFiles.Add(@"C:\Users\David\Pictures\blank.png");
lFiles.Add(@"C:\Users\David\Pictures\blank.png");
lFiles.Add(@"C:\Users\David\Pictures\blank.png");

IMagickImage roundImg = new MagickImage();
IMagickImage mask = new MagickImage();
IMagickImage shadow = new MagickImage();
IMagickImage result = new MagickImage();
bool isBlankImage = false;

foreach (string tempFBProfileImg in lFiles)
{
roundImg = new MagickImage(tempFBProfileImg);

if (Regex.IsMatch(@"C:\Users\David\Pictures\blank.png", @"\bblank.png\b"))
{
roundImg = new MagickImage(MagickColors.White, 100, 100);
roundImg.Resize(100, 100);
roundImg.Transparent(MagickColors.White);
}
else
{
mask = new MagickImage("xc:black", 100, 100);
mask.Settings.FillColor = MagickColors.White;
mask.Draw(new DrawableCircle(50, 50, 50, 90));
mask.HasAlpha = false;

roundImg.Resize(100, 100);
roundImg.Composite(mask, CompositeOperator.CopyAlpha);
roundImg.Draw(
new DrawableStrokeColor(MagickColors.Black),
new DrawableStrokeWidth(1),
new DrawableFillColor(MagickColors.None),
new DrawableCircle(50, 50, 50, 90)
);

shadow = new MagickImage("xc:none", 100, 100);
shadow.Settings.FillColor = MagickColors.Black;
shadow.Draw(new DrawableCircle(50, 50, 50, 90));
shadow.Blur(0, 5);
roundImg.Composite(shadow, CompositeOperator.DstOver);
}

images.Add(roundImg);
images.First().BackgroundColor = MagickColors.None;
result = images.SmushHorizontal(-35);
result.Resize(360, 0);
result.Write(@"C:\Users\David\Pictures\final.png");
}
}
В приведенном выше коде я создаю белый квадрат 100x100. Затем я изменяю его размер до 100x100 и делаю белый фон прозрачным для пустого изображения.
Я получаю следующую ошибку:

'ширина или высота превышает предел `#FFFFFFFFFFFF' @ error/cache.c/OpenPixelCache/3491'

на result.Write(@"C:\Users\David\Pictures\final.png"); строку.
Когда у меня работает только этот код:

Код: Выделить всё

MagickImage roundImg = new MagickImage(MagickColors.White, 100, 100);
roundImg.Resize(100, 100);
roundImg.Transparent(MagickColors.White);
roundImg.Write(@"C:\Users\David\Pictures\aloneTest.png");
Кажется, работает нормально...
Изображение

Как я могу заставить это работать, поскольку оно мне тоже нужно?
Использованные изображения:

Изображение


Blank.png start ----
Изображение

Blank.png end ----
Что я я хочу, чтобы оно выглядело так:
Изображение

что на самом деле выглядит так, поскольку файл Blank.png прозрачный:
Изображение

Ширина будет разной в зависимости от того, сколько пустых изображений в формате png необходимо вставить, чтобы получить такую ширину. В приведенном выше примере 5 изображений, 4 из которых пустые.
Использование примера Bonzos на C#:

Код: Выделить всё

 roundImg.Resize(new MagickGeometry(100, 100));
roundImg.BackgroundColor = MagickColors.Transparent;
roundImg.Extent(360, 100, Gravity.West);
result = roundImg;
Создает просто прозрачное изображение размером 360 x 100.
Пробовал fmw42:

Код: Выделить всё

 mask = new MagickImage("xc:black", 100, 100);
mask.Settings.FillColor = MagickColors.White;
mask.Draw(new DrawableCircle(50, 50, 50, 100));
mask.HasAlpha = false;
mask.Resize(100, 100);
roundImg.Composite(mask, CompositeOperator.CopyAlpha);
Возможное решение

Код: Выделить всё

 if (Regex.IsMatch(tempFBProfileImg.ToLower(), @"\bblank.png\b"))
{
result.Extent(360, 100, Gravity.West);
images.Add(result);
break;
}
что приведет к следующему:
Изображение


Подробнее здесь: https://stackoverflow.com/questions/494 ... g-to-width
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»