void __fastcall TMainForm::ReduceColor (Graphics::TBitmap *Src, Graphics::TBitmap *Dst, int Zoom)
{
int W = Src->Width / Zoom;
int H = Src->Height / Zoom;
Dst->Width = W;
Dst->Height = H;
Dst->PixelFormat = pf24bit;
for (int y = 0, ty1 = 0; y < H; y++, ty1 += Zoom)
{
byte* PDst = (byte*) Dst->ScanLine[y];
for (int x = 0, tx1 = 0; x < W; x++, tx1 += Zoom)
{
int R = 0, G = 0, B = 0, Count = 0, tx2 = tx1 + Zoom, ty2 = ty1 + Zoom, Index = 3 * tx1;
for (int ty = ty1; ty < ty2; ty++)
{
byte* PSrc = ((byte*) Src->ScanLine[ty]) + Index;
for (int tx = tx1; tx < tx2; tx++)
{
B += PSrc[0]; G += PSrc[1]; R += PSrc[2]; PSrc += 3;
Count++;
}
}
PDst[0] = B / Count; PDst[1] = G / Count; PDst[2] = R / Count; PDst += 3;
}
}
}
//---------------------------------------------------------------------------
Уменьшение размера фотки на канве
Я переношу из Битмапа картинку на канву другого объекта, размер которой в оригинале 1200х1600 (например), надо уменьшить размер картинки до 150х200 и на этойже канве расположить еще одну картинку.
StretchDraw
Подскажите либо что нить другое, либо как сохранить качество изображения!
Цитата: iRain
Хорошая функция, вроде бы как и решает проблему, но нет! Очень сильно искажает изображение.
Подскажите либо что нить другое, либо как сохранить качество изображения!
Подскажите либо что нить другое, либо как сохранить качество изображения!
Тогда ищите какие-нибудь библиотеки по работе с растровой графикой, допустим CxImage. Со стандартными функциями GDI, насколько я знаю, приемлемого результата при масштабировании изображения добиться довольно сложно.
..Или используйте GDI+
на входе битмап WxHx24bit + коэф.сжатия, на выходе - сжатая картинка. Сжимает вцелое число раз.
работает шустро, качество сравнимо с фотошопом :)
Код: