Ответ 1
B.Clone(new Rectangle(0, 0, B.Width, B.Height), B.PixelFormat)
Я имею дело с растровыми изображениями в моем приложении, и для некоторых целей мне нужно создать глубокую копию растрового изображения. Есть ли элегантный способ, как это сделать?
Я пробовал
Bitmap deepCopy = original.Clone();
очевидно, это не создает глубокую копию, но мелкую. Моя следующая попытка состояла в создании нового растрового изображения
Bitmap deepCopy = new Bitmap(original);
К сожалению, этот конструктор - Bitmap (Image), а не Bitmap (Bitmap) и Bitmap (Image) преобразует мой красивый 8bppIndexed Pixelformat в другой.
Другая попытка заключалась в использовании MemoryStream
public static Bitmap CreateBitmapDeepCopy(Bitmap source)
{
Bitmap result;
using (MemoryStream stream = new MemoryStream())
{
source.Save(stream, ImageFormat.Bmp);
stream.Seek(0, SeekOrigin.Begin);
result = new Bitmap(stream);
}
return result;
}
Ну, это тоже не сработает, так как MemoryStream должен быть открыт в течение всего срока службы Bitmap.
Итак, я подытожил все свои предсказания, и мне очень хотелось бы увидеть красивый элегантный способ создания глубокой копии Bitmap. Спасибо за это:)
B.Clone(new Rectangle(0, 0, B.Width, B.Height), B.PixelFormat)
Вы можете сериализовать растровое изображение, а затем десериализовать его. Растровое изображение сериализуемо.
Другим способом, который я наткнулся на то, что достигается то же самое, является поворот или переворот изображения. Под капотом, который, кажется, создает совершенно новую копию растрового изображения. Выполнение двух поворотов или флип позволяет получить точную копию исходного изображения.
result.RotateFlip(RotateFlipType.Rotate180FlipX);
result.RotateFlip(RotateFlipType.Rotate180FlipX);
Предположим, что у вас уже есть растровое изображение, называемое оригиналом, с чем-то в нем
Bitmap original = new Bitmap( 200, 200 );
Bitmap copy = new Bitmap(original.Width, original.Height);
using (Graphics graphics = Graphics.FromImage(copy))
{
Rectangle imageRectangle = new Rectangle(0, 0, copy.Width, copy.Height);
graphics.DrawImage( original, imageRectangle, imageRectangle, GraphicsUnit.Pixel);
}
Это должно создать копию того же размера и нарисовать оригинал в копии.