Qt开发 —QImage 的裁剪 和透明化处理
在开发过程中 我们往往需要对照片裁剪,而裁剪的时候就需要保留有效的数据。那么久需要计算数据在图像中的有效位置以及大小。而采取的方法就是:将图片转化为背景透明,然后在裁剪掉透明部分。
QImage 透明化处理
void ConvertImageToTransparent(QImage &img)
{
img = img.convertToFormat(QImage::Format_ARGB32);
union myrgb
{
uint rgba;
uchar rgba_bits[4];
};
myrgb* mybits =(myrgb*) img.bits();
int len = img.width()*img.height();
while(len --> 0)
{
mybits->rgba_bits[3] = (mybits->rgba== 0xFFFFFFFF)?0:255;
mybits++;
}
}
裁剪
void RemoveImageTransparent(QImage &img)
{
QImage p = img;
int l =p.width(), r = 0, t = p.height(), b = 0;
for (int y = 0; y < p.height(); ++y) {
QRgb *row = (QRgb*)p.scanLine(y);
bool rowFilled = false;
for (int x = 0; x < p.width(); ++x) {
if (qAlpha(row[x]) ) {
rowFilled = true;
r = std::max(r, x);
if (l > x) {
l = x; x = r;
}
}
}
if (rowFilled) {
t = std::min(t, y);
b = y;
}
}
QRect imgRect = QRect(QPoint(l, t), QPoint(r, b));
img = img.copy(imgRect);
}
效果如下:
原始图:
裁剪后的图片: