Я пытаюсь скользить по нескольким изображениям, в основном у вас есть 2 кнопки вперед и назад. Они предназначены для прокрутки изображений списка. Как только один из них достигнет конца, он должен вернуться на другую сторону списка. Вот что у меня естьWinForms Растровая область уже заблокирована
private List<Bitmap> RotatePacks = new List<Bitmap> { new Bitmap(@"Assets\All_Cards\All_Royal\All_Royal.png"),
new Bitmap(@"Assets\All_Cards\All_Classic\All_Classic.jpg")};
private void bNext_Click(object sender, EventArgs e)
{
Bitmap currentImage = (Bitmap)pickCards.Image;
for (int i = 0; i < RotatePacks.Count; i++)
{
if (AreEqual(currentImage, RotatePacks[i]))
{
try
{
pickCards.Image = RotatePacks[i + 1];
}
catch (Exception)
{
bPrevious_Click(sender, e);
pickCards.Image = RotatePacks[i - 1];
}
}
}
}
private void bPrevious_Click(object sender, EventArgs e)
{
Bitmap currentImage = (Bitmap)pickCards.Image;
for (int i = 0; i < RotatePacks.Count; i++)
{
if (AreEqual(currentImage, RotatePacks[i]))
{
try
{
pickCards.Image = RotatePacks[i - 1];
}
catch (Exception)
{
bNext_Click(sender, e);
}
}
}
}
Это 2 кнопки. Здесь я пытаюсь сравнить изображение pictureBox, в котором хранятся изображения со списком RotatePacks
. Как это, я получаю текущее изображение, которое отображается. Вот метод AreEqual:
public unsafe static bool AreEqual(Bitmap b1, Bitmap b2) // copy pasted
{
if (b1.Size != b2.Size)
{
return false;
}
if (b1.PixelFormat != b2.PixelFormat)
{
return false;
}
/*if (b1.PixelFormat != PixelFormat.Format32bppArgb)
{
return false;
}*/
Rectangle rect = new Rectangle(0, 0, b1.Width, b1.Height);
BitmapData data1
= b1.LockBits(rect, ImageLockMode.ReadOnly, b1.PixelFormat);
BitmapData data2
= b2.LockBits(rect, ImageLockMode.ReadOnly, b1.PixelFormat);
int* p1 = (int*)data1.Scan0;
int* p2 = (int*)data2.Scan0;
int byteCount = b1.Height * data1.Stride/4; //only Format32bppArgb
bool result = true;
for (int i = 0; i < byteCount; ++i)
{
if (*p1++ != *p2++)
{
result = false;
break;
}
}
b1.UnlockBits(data1);
b2.UnlockBits(data2);
return result;
}
Так теперь вернусь к моей проблеме кнопка работает именно так, как я хочу их, но они работают только один раз. Если я нажму кнопку дальше, а затем кнопку предыдущей или я нажму следующую кнопку дважды, программа выйдет из строя. Это дает мне исключение здесь
BitmapData data2
= b2.LockBits(rect, ImageLockMode.ReadOnly, b1.PixelFormat);
Вот некоторые скриншоты фактического исключения:
- PS Im используя этот метод сравнения, но я не программировать , Я скопировал код из другого StackOverflow вопрос
Это просто дикая догадка сейчас ... но вы не думаете, что стоит раннее проверить 'if (b1 == b2) return true; '? Вероятно, 'b1 == b2' вызовет эту проблему ... – Ian