Я разрабатываю приложение с использованием C ++
Я столкнулся с проблемой при попытке сделать снимок экрана. затем отредактируйте некоторые из его пикселей
и сохранить изображение
Мой код работает абсолютно нормально, когда я выбираю платформу как Win32
но как только я меняю платформу с Win32 на x64, код не работает
Это начинает давать нарушение доступа при попытке доступа к пикселям
Я проверил, что на обеих платформах размер int составляет 4 байта, а imageData.Stride имеет значение -5528.
когда я делаю (строка * шаг / 4 + столбец), я получаю одинаковое значение на обеих платформах
imageData.getPixelFormat () возвращает 139273, то есть PixelFormat32bppRGB
под обеими платформами
Я размещаю код ниже
пожалуйста, помогите мне, я сделал много Google, но ничего не помогает
Ошибка нарушения прав доступа появляется в этой строке
UINT curColor = пиксели [row * iStride / 4 + col];
когда значение строки> 0
void BitmapToJpg(HBITMAP hbmpImage, int width, int height)
{
p_bmp = Bitmap::FromHBITMAP(hbmpImage, NULL);CLSID pngClsid;
int result = GetEncoderClsid(L"image/jpeg", &pngClsid);
if (result != -1)
std::cout << "Encoder succeeded" << std::endl;
else
std::cout << "Encoder failed" << std::endl;//***************************Testing Lockbits********************************//
// successfull results and position is also correct
BitmapData imageData;
Rect rect(0, 0, width, height);
p_bmp->LockBits(
&rect,
ImageLockModeWrite,
p_bmp->GetPixelFormat(),
//PixelFormat24bppRGB,
&imageData);
cout << p_bmp->GetPixelFormat();
UINT* pixels;
pixels = (UINT*)imageData.Scan0;
int iStride = imageData.Stride;
int x = sizeof(int);
byte red = 0;
byte green = 0;
byte blue = 255;
byte alpha = 0;
for (int row = 0; row < height; ++row)
{
for (int col = 0; col < width; ++col)
{
///Some code to get color
UINT curColor = pixels[row * iStride / 4 + col];
int b = curColor & 0xff;
int g = (curColor & 0xff00) >> 8;
int r = (curColor & 0xff0000) >> 16;
int a = (curColor & 0xff000000) >> 24;
//result_pixels[col][row] = RGB(r, g, b);
if (b>15 && b < 25 && g<5 && r>250)
{
//Red found
//Code to change color, generate ARGB from provided RGB values
UINT32 rgb = (alpha << 24) + (red << 16) + (green << 8) + (blue);
curColor = rgb;
b = curColor & 0xff;
g = (curColor & 0xff00) >> 8;
r = (curColor & 0xff0000) >> 16;
a = (curColor & 0xff000000) >> 24;cout << "Red found" << endl;
pixels[row * iStride / 4 + col]=rgb;
}
}
}
p_bmp->UnlockBits(&imageData);
//*****************************Till Here*************************************//
p_bmp->Save(L"screen.jpg", &pngClsid, NULL);
delete p_bmp;
}
Задача ещё не решена.
Других решений пока нет …