Насколько я знаю, это на 100% безопасно, поскольку полученное изображение на 100% создано в памяти без каких-либо связанных ресурсов и без открытых потоков, оставшихся в памяти. Он действует как любой другой Bitmap
, созданный из конструктора, который не указывает какие-либо источники ввода, и в отличие от некоторых других ответов здесь он сохраняет исходный формат пикселей, то есть он может использоваться в индексированных форматах.
На основе этого ответа , но с дополнительными исправлениями и без импорта внешней библиотеки.
///
/// Clones an image object to free it from any backing resources.
/// Code taken from http://stackoverflow.com/a/3661892/ with some extra fixes.
///
/// The image to clone
/// The cloned image
public static Bitmap CloneImage(Bitmap sourceImage)
{
Rectangle rect = new Rectangle(0, 0, sourceImage.Width, sourceImage.Height);
Bitmap targetImage = new Bitmap(rect.Width, rect.Height, sourceImage.PixelFormat);
targetImage.SetResolution(sourceImage.HorizontalResolution, sourceImage.VerticalResolution);
BitmapData sourceData = sourceImage.LockBits(rect, ImageLockMode.ReadOnly, sourceImage.PixelFormat);
BitmapData targetData = targetImage.LockBits(rect, ImageLockMode.WriteOnly, targetImage.PixelFormat);
Int32 actualDataWidth = ((Image.GetPixelFormatSize(sourceImage.PixelFormat) * rect.Width) + 7) / 8;
Int32 h = sourceImage.Height;
Int32 origStride = sourceData.Stride;
Int32 targetStride = targetData.Stride;
Byte[] imageData = new Byte[actualDataWidth];
IntPtr sourcePos = sourceData.Scan0;
IntPtr destPos = targetData.Scan0;
// Copy line by line, skipping by stride but copying actual data width
for (Int32 y = 0; y < h; y++)
{
Marshal.Copy(sourcePos, imageData, 0, actualDataWidth);
Marshal.Copy(imageData, 0, destPos, actualDataWidth);
sourcePos = new IntPtr(sourcePos.ToInt64() + origStride);
destPos = new IntPtr(destPos.ToInt64() + targetStride);
}
targetImage.UnlockBits(targetData);
sourceImage.UnlockBits(sourceData);
// For indexed images, restore the palette. This is not linking to a referenced
// object in the original image; the getter of Palette creates a new object when called.
if ((sourceImage.PixelFormat & PixelFormat.Indexed) != 0)
targetImage.Palette = sourceImage.Palette;
// Restore DPI settings
targetImage.SetResolution(sourceImage.HorizontalResolution, sourceImage.VerticalResolution);
return targetImage;
}
Для вызова просто используйте:
/// Loads an image without locking the underlying file.
/// Path of the image to load
/// The image
public static Bitmap LoadImageSafe(String path)
{
using (Bitmap sourceImage = new Bitmap(path))
{
return CloneImage(sourceImage);
}
}
Или, из байтов:
/// Loads an image from bytes without leaving open a MemoryStream.
/// Byte array containing the image to load.
/// The image
public static Bitmap LoadImageSafe(Byte[] fileData)
{
using (MemoryStream stream = new MemoryStream(fileData))
using (Bitmap sourceImage = new Bitmap(stream)) {
{
return CloneImage(sourceImage);
}
}
=
, команда отступа может взять движения. Так, gg
, чтобы заставить запуск файла, =
делать отступ, G
в конец файла, gg=G
.
vi должен уважать вкладки и пробелы, однако необходимо полагать, что vi может использовать различные вкладки длины, чем другой редактор. Можно ли быть больше конкретными, чем "целая испорченная вещь"?
В Vim используйте :insert
. Это сохранит все Ваше форматирование и не сделает автоматический отступ. Для получения дополнительной информации help :insert
.
1G=G
. Это должно расположить все строки с отступом в файле. 1G
берет Вас, первая строка, =
запустит автоматический отступ, и финал G
возьмет Вас последняя строка в файле.
Прежде, чем вставить в терминал, попробуйте :set paste
(и затем :set nopaste
после того, как Вы будете сделаны). Это выключит автоматический отступ, перенесется строка, и т.д. функции, которые портят Вашу вставку.
редактирование: Кроме того, я должен указать, что намного лучший результат, чем = расположение с отступом может обычно получаться при помощи внешней программы. Например, я работаю :%!perltidy
все время. astyle, cindent, и т.д. может также использоваться. И, конечно, можно отобразить тех который к ключу stroke — и отобразить различные на то же нажатие клавиши в зависимости от типа файла
:set paste
Ваш друг, я использую шпаклевку и заканчиваю тем, что копировал код между окнами. Прежде чем я был включен к :set paste
(и :set nopaste
) скопировать/вставить дал мне, соответствует той самой причине.
abc.py
в том же каталоге как Ваш сценарий или каталог, Вы запускаете интерактивную оболочку в и делаете import abc
. Особенно, если it' s только для маленького сценария, я думаю, что это - простое решение, но я не использовал бы его в " real" проект.
– tobias_k
15 October 2013 в 22:08
Вы можете использовать аккуратное приложение / служебную программу для создания отступов в файлах HTML и XML, и они довольно хорошо работают с отступами в этих файлах.
Преобразование файла XML
:!tidy -mi -xml %
Преобразование файла HTML
:!tidy -mi -html %
, если вы не хотите использовать : установите вставку
, средний- щелкните, установить nopaste
, вы также можете вставить содержимое буфера обмена:
"*p
"+p
Таким образом вам не придется выходить из обычного режима.
Если вам нужно вставить +
или *
, в зависимости от того, как вы выбрали текст, см. : help quoteplus
.