У меня есть ошибка в моем простом классе изображений с блокировкамиC#

Место общения программистов C#
Ответить
Anonymous
 У меня есть ошибка в моем простом классе изображений с блокировками

Сообщение Anonymous »

У меня есть этот простой класс, чтобы график точек на изображении. Это ограничено 24BBP. Но при определенной ширине изображение разрывается, цвета искажаются, и изображение движется вправо вниз вниз в изображении, которое оно получает. Это правильное только тогда, когда ширина равен 4, и я не могу понять, почему. Кто -нибудь может указать на мою ошибку? Спасибо, ребята.
Пример проблемы < /p>
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using static System.Math;

public class TImage
{
private readonly Bitmap source = null;
private IntPtr Iptr = IntPtr.Zero;
private BitmapData bitmapData = null;
private bool locked = false;
private readonly int PixelCount;
private byte[] pixels;
public int Width { get; private set; }
public int Height { get; private set; }

public TImage(int width, int height)
{
source = new Bitmap(width, height, PixelFormat.Format24bppRgb);
Width = width; Height = height;
PixelCount = Width * Height;
}

public TImage(Bitmap image)
{
if (image.PixelFormat != PixelFormat.Format24bppRgb) throw new FormatException("Only 24bppRgb can be used");
source = image;
Width = source.Width; Height = source.Height;
PixelCount = Width * Height;
}

private void Lock()
{
if (!locked)
{
Rectangle rect = new Rectangle(0, 0, Width, Height);
bitmapData = source.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

// create byte array to copy pixel values
pixels = new byte[PixelCount * 3];
Iptr = bitmapData.Scan0;

// Copy data from pointer to array
Marshal.Copy(Iptr, pixels, 0, pixels.Length);
locked = true;
}
}

private void Unlock()
{
if (locked)
{
Marshal.Copy(pixels, 0, Iptr, pixels.Length);
source.UnlockBits(bitmapData);
locked = false;
}
}

public Color GetPixel(int x, int y)
{
if (!locked) Lock();

// Get start index of the pixel
int i = (y * Width + x) * 3;

if (i+2 > pixels.Length || i = 0)
{
pixels = color.B;
pixels[i + 1] = color.G;
pixels[i + 2] = color.R;
}
}

public void SetPixel(double x, double y, Color color)
{
SetPixel((int)Round(x), (int)Round(y), color);
}

public static implicit operator Bitmap(TImage img)
{
img.Unlock();
return img.source;
}
}


Подробнее здесь: https://stackoverflow.com/questions/698 ... mage-class
Ответить

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

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

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

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

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