Я пытаюсь уменьшить изображение на 2, изображение, которое я предполагал, что оно серое, поэтому я буду работать только с одним каналом, я попытался усреднить 4 пикселя, а затем поместить результат в destImage. Я не знаю, как правильно заполнить DestImage. Пожалуйста, найдите код здесь:
void downsizeRow(unsigned char *srcImage, unsigned char *dstImage, int srcWidth )
{
unsigned char *srcPtr = srcImage;
unsigned char *dstPtr = dstImage;
int stride = srcWidth;
int b;
for (int i = 0; i< 4; i++)
{
b = srcPtr[0]+srcPtr[1] + srcPtr[stride + 0] + srcPtr[stride + 1] ;
srcPtr++;
dstPtr[0] = (uint8_t)((b + 2)/4);;
dstPtr++;
}
}
void downscaleImage( unsigned char *srcImage, unsigned char *dstImage, int srcWidth, int dstHeight, int dstWidth)
{
unsigned char *srcPtr=srcImage;
unsigned char *dstPtr=dstImage;
int in_stride = dstWidth;
int out_stride = dstHeight;
for (int j=0;j<dstHeight;j++)
{
downsizeRow(srcPtr, dstPtr, srcWidth); // in_stride is needed
// as the function requires access to iptr+in_stride
srcPtr+=in_stride * 2;
dstImage+=out_stride;
}
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
unsigned char srcimage[4*4];
unsigned char dstimage[2*2];for (int i = 0; i<4*4; i++)
{
srcimage[i] = 25;
}
std::cout<<"source Image \n"<<std::endl;
for (int i = 0; i<4*4; i++)
{
std::cout<<srcimage[i];
}
downscaleImage(srcimage, dstimage, 4,4,2);
std::cout<<"dest Image"<<std::endl;
for (int i = 0; i<2*2; i++)
{
// std::cout<<dstimage[i];
}
return a.exec();
}
В вашем коде нет ничего плохого — в основном, просто следите за местоположением указателя чтения / записи (не забывайте обновлять по шагам). Это требует использования 2-х вложенных циклов тем или иным способом. (+ установите делитель на 4).
Я нашел следующий подход полезным: обработка по одной строке за раз приводит к небольшому снижению скорости, но позволяет легче интегрировать различные ядра.
iptr=input_image; in_stride = in_width;
optr=output_image; out_stride = out_width;
for (j=0;j<out_height;j++) {
process_row(iptr, optr, in_width); // in_stride is needed
// as the function requires access to iptr+in_stride
iptr+=in_stride * 2;
optr+=out_stride;
}
Я вижу, что вы используете Qt, так что на всякий случай, если вам не нужно заново изобретать колесо, QImage имеет удобную функцию, которая сделает для вас изменение размера (эффективно понижающую выборку).
QImage smallImage = bigImage.scaled(bigImage.width() / 2, bigImage.heigth() / 2, Qt::KeepAspectRatio, Qt::SmoothTransformation);
В случае, если QImage слишком медленный для вас, вы также можете попробовать использовать QPixmap, который обычно работает быстрее.
Опуская Qt::SmoothTransformation
вернется к использованию по умолчанию Qt::FastTransformation
что будет еще быстрее.