Я использую пользовательский класс для записи изображения на другое изображение большего размера. Вот полный source code в DotNetFiddle.Рисование растрового изображения на другое создает искаженное изображение
Мой заказ GetPixel()
отлично работает. Но следующее SetPixel()
не может произвести надлежащий вывод. Вероятно, были проблемы с расчетом адресов. Но я не могу это обнаружить.
public void SetPixel(int x, int y, Color color)
{
// Get color components count
int cCount = ColorDepth/8;
// Get start index of the specified pixel
int i = ((y * Width) + x) * cCount;
//int i = ((x * Width) + y) * cCount;
if (ColorDepth == 32) // For 32 bpp set Red, Green, Blue and Alpha
{
_imageData[i] = color.B;
_imageData[i + 1] = color.G;
_imageData[i + 2] = color.R;
_imageData[i + 3] = color.A;
}
if (ColorDepth == 24) // For 24 bpp set Red, Green and Blue
{
_imageData[i] = color.B;
_imageData[i + 1] = color.G;
_imageData[i + 2] = color.R;
}
if (ColorDepth == 8)
{
// For 8 bpp set color value (Red, Green and Blue values are the same)
_imageData[i] = color.B;
string str = string.Empty;
}
}
Это порождает искаженное изображение:
.
P.S. Вот входное изображение:
.
.
«Указатель вне диапазона» - это ключ, который вы получаете. Он ссылается на '_imageData [i]' и не имеет ничего общего с Get/Set pixels, за исключением того, что в коде есть ошибка. Поскольку отладчик уже активен, найдите время, чтобы проверить значение 'i' и размер' _imageData'. – user2864740
Также обратите внимание, что '(x * Q) + y' не может быть слепо« перевернуто »как' (y * Q) + x' (они приведут к другому диапазону), когда 'y! = X'. – user2864740
Попробуйте изменить размер изображения с сохранением Соотношение сторон: обзор http://stackoverflow.com/questions/1940581/c-sharp-image-resizing-to-different-size-while-preserving-aspect-ratio –