Я создаю записываемое растровое изображение Gray8 в WPF/.Net 8.
Когда я устанавливаю для этого параметра источник изображения, в результате получается полностью черное изображение примерно правильного размера.
Если я сохраню записываемое растровое изображение (с помощью PngEncoder), изображение сохранится так, как я и ожидал. Если я перезагружаю изображение PNG с диска в элемент управления «Изображение», оно отображается совершенно нормально.
Однако если я воссоздаю изображение, повторно сохраню его и перезагрузлю, оно не отобразится — исходное изображение сохранится.
Меня главным образом беспокоит то, что мне нужно сделать, чтобы записываемое растровое изображение не выглядело черным, поскольку мне не нужно сохранять и так далее.
Цель растрового изображения — показать серию столбцов, темнота которых соответствует значениям в массиве — своего рода гистограмма плотности.
public BitmapSource CreateLineWeightImage()
{
if (LineWeights == null) throw new InvalidOperationException("Must GetLineWeights first");
WriteableBitmap lineWeights = new WriteableBitmap(LineWeightImageWidth, OriginalImage.PixelHeight, 96, 96, PixelFormats.Gray8, null);
lineWeights.Lock();
unsafe
{
for (int y = 0; y < lineWeights.PixelHeight; ++y)
{
for (int x = 0; x < LineWeightImageWidth; ++x)
{
byte* PixelPtr = (byte*)lineWeights.BackBuffer + y * lineWeights.BackBufferStride + x;
*((byte*)PixelPtr) = (byte)LineWeights[y];
}
}
}
lineWeights.Unlock();
LineWeightsImage = lineWeights;
return lineWeights;
}
Спасибо
Иэн
@MartinBrown PixelFormats.Gray8
палитра не нужна.
Думаю, вам следует переместить вызовы Lock()
и Unlock()
в блок try/finally
; в противном случае ваша программа взорвется, если в вашем блоке unsafe
произойдет что-нибудь плохое.
Из любопытства, что такое LineWeights
и почему вы приводите его элементы к Byte
? Если элементы на самом деле не являются значениями byte
, то каков риск того, что будет использовано значение, отличное от 0-255
?
Вы можете заменить внутренний цикл (над x) на System.Runtime.CompilerServices.Unsafe.InitBlock((byte*)lineWeights.BackBuffer + y * lineWeights.BackBufferStride, (byte)LineWeights[y], (uint)lineWeights.PixelWidth);
Дай. Я работаю над определением номеров страниц в последовательности отсканированных страниц, чтобы проверить, нет ли прерываний из-за плохого сканирования. Вес линий — это визуализация (фактически) того, сколько черных пикселей находится в строке, и, следовательно, индикатор того, где находятся линии, поэтому я могу извлечь верхнюю и нижнюю строки на странице и определить, какая из них имеет номер страницы. Спасибо другим за комментарии
Вы должны сообщить WriteableBitmap, какие изменения были внесены в его BackBuffer, вызвав метод AddDirtyRect
перед Unlock
:
lineWeights.AddDirtyRect(new Int32Rect(
0, 0, lineWeights.PixelWidth, lineWeights.PixelHeight));
lineWeights.Unlock();
Именно в этом и заключалась проблема. много вещей
Я думаю, что ваш вопрос фактически дублирует этот вопрос Как определить 8-битное растровое изображение в оттенках серого. Без правильной информации о палитре индексированные цвета вполне могут быть черными (или каким-либо другим шаблоном заполнения памяти).