Qt | QPixmap缩放不正确

时间:2016-06-08 16:29:47

标签: c++ qt resize qpixmap

我有一个QPixmap,我将其设置为在调整窗口大小时根据比例调整大小。当图像首次加载时,对于该比例是好的和清晰的,但是当我调整图像大小时,它会扭曲所有图像。 它设法从这个: Image before resizing window 对此: Image before resizing window

相关守则:

void MainWindow::resizeEvent(QResizeEvent *)
{
    QPixmap pix = ui->labelImage->pixmap()->scaled(ui->labelImage->size(),
                                                   Qt::KeepAspectRatio);
    ui->labelImage->setPixmap(pix);
}

1 个答案:

答案 0 :(得分:4)

您正在从窗口小部件中读取当前的像素图,缩放它,然后将缩放的像素图写入窗口小部件。考虑如果小部件变得非常小并且然后将其调整为更大的大小会发生什么 - 由于使用了缩放转换,您将获得大量伪像。

我认为更好的方法是将原始的完整尺寸图像存储在MainWindow类的成员中,比如...

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view=inflater.inflate(R.layout.fragment_lugar,container,false);
    latitude = 26.78;
    longitude = 72.56;
    mMapView = (MapView) view.findViewById(R.id.mapView);
    mMapView.onCreate(savedInstanceState);

    mMapView.onResume();// needed to get the map to display immediately

    try {
        MapsInitializer.initialize(getActivity().getApplicationContext());
    } catch (Exception e) {
        e.printStackTrace();
    }

    googleMap = mMapView.getMap();
    // latitude and longitude
    double latitude = 17.385044;
    double longitude = 78.486671;

    // create marker
    MarkerOptions marker = new MarkerOptions().position(
            new LatLng(latitude, longitude)).title("Hello Maps");

    // Changing marker icon
    marker.icon(BitmapDescriptorFactory
            .defaultMarker(BitmapDescriptorFactory.HUE_ROSE));

    // adding marker
    googleMap.addMarker(marker);
    CameraPosition cameraPosition = new CameraPosition.Builder()
            .target(new LatLng(17.385044, 78.486671)).zoom(12).build();
    googleMap.animateCamera(CameraUpdateFactory
            .newCameraPosition(cameraPosition));
    return view;
}
/***** Sets up the map if it is possible to do so *****/
@Override
public void onResume() {
    super.onResume();
    mMapView.onResume();
}

@Override
public void onPause() {
    super.onPause();
    mMapView.onPause();
}

@Override
public void onDestroy() {
    super.onDestroy();
    mMapView.onDestroy();
}

@Override
public void onLowMemory() {
    super.onLowMemory();
    mMapView.onLowMemory();
}

然后在resizeEvent成员中使用缩放版本...

QPixmap m_original_pixmap;

不确定是否会清除所有内容,但应该采取某种方式来删除一些文物。

作为旁注,如果您关注图像质量,可以考虑在缩放操作中将Qt :: SmoothTransformation指定为像素图变换模式。