黑莓级联中的图像旋转问题

时间:2015-01-27 09:56:58

标签: blackberry imageview qml blackberry-10 blackberry-cascades

我有一个应用程序,用户可以在其中拍摄并保存他们的个人资料照片。我正在使用来自github的https://github.com/RileyGB/BlackBerry10-Samples/tree/master/WebImageViewSample示例将图片从网址加载到我的视图中,并且工作正常。问题是当我从ios保存配置文件pic并在黑莓中查看配置文件时,它显示为向左旋转90度。但是相同的url在ios和android中加载很好。下面是从iOS获取的示例图像的链接,正确加载ios和android但在黑莓中向左移动90度。它适用于从黑莓或Android获取的其他图像。有没有什么办法解决这一问题?任何帮助表示赞赏

http://oi57.tinypic.com/2hzj2c4.jpg

以下是在qml中加载此图片的示例代码

Page {
    Container {
        layout: DockLayout {
        }
        WebImageView {
            id: webViewImage
            url: "http://oi57.tinypic.com/2hzj2c4.jpg"
            horizontalAlignment: HorizontalAlignment.Center
            verticalAlignment: VerticalAlignment.Center
            visible: (webViewImage.loading == 1.0)
        }
        ProgressIndicator {
            value: webViewImage.loading
            verticalAlignment: VerticalAlignment.Center
            horizontalAlignment: HorizontalAlignment.Center
            visible: (webViewImage.loading < 1.0)
        }
    }

    actions: [
        ActionItem {
            title: "Clear Cache"
            ActionBar.placement: ActionBarPlacement.OnBar
            onTriggered: {
                webViewImage.clearCache();
                webViewImage.url = "http://oi57.tinypic.com/2hzj2c4.jpg";
            }
        }
    ]
}

1 个答案:

答案 0 :(得分:0)

我能够通过添加EXIF库并在webimageview类中添加其他功能来解决此问题

QByteArray WebImageView::getRotateImage(QByteArray imageFile)
{
    //Load the image using QImage.
    // A transform will be used to rotate the image according to device and exif orientation.
       QTransform transform;
    QImage image;
    image.loadFromData((unsigned char*)imageFile.data(),imageFile.length(),"JPG");

    ExifData *exifData = 0;
    ExifEntry *exifEntry = 0;
    int exifOrientation = 1;

    // Since the image will loose its exif data when its opened in a QImage
    // it has to be manually rotated according to the exif orientation.
    exifData = exif_data_new_from_data((unsigned char*)imageFile.data(),(unsigned int)imageFile.size());

    // Locate the orientation exif information.
    if (exifData != NULL) {

        for (int i = 0; i < EXIF_IFD_COUNT; i++) {
            exifEntry = exif_content_get_entry(exifData->ifd[i], EXIF_TAG_ORIENTATION);
            // If the entry corresponds to the orientation it will be a non zero pointer.
            if (exifEntry) {
                exifOrientation = exif_get_short(exifEntry->data, exif_data_get_byte_order(exifData));
                break;
            }
        }
    }
    // It's a bit tricky to get the correct orientation of the image. A combination of
    // the way the the device is oriented and what the actual exif data says has to be used
    // in order to rotate it in the correct way.
    switch(exifOrientation) {
        case 1:
            // 0 degree rotation
            return imageFile;
            break;
        case 3:
            // 180 degree rotation
            transform.rotate(180);
            break;
        case 6:
            // 90 degree rotation
            transform.rotate(90);
            break;
        case 8:
            // 270 degree rotation
            transform.rotate(270);
            break;
        default:
            // Other orientations are mirrored orientations, do nothing.
            break;
    }

    // Perform the rotation of the image before its saved.
    image = image.transformed(transform);

    QImage img =image;
    QByteArray arr;
    QBuffer buf(&arr);
    buf.open(QIODevice::WriteOnly);
    img.save(&buf, "PNG");
    buf.close();
    return arr;

}