• 7440阅读
  • 7回复

我又来问问题了,图片太大,开发板out of memory,如何处理! [复制链接]

上一主题 下一主题
离线wangmuhai
 

只看楼主 正序阅读 楼主  发表于: 2010-04-13
各位好,现在要用qt做图片播放器,但是现在的图片一般尺寸很大,所以自己从网上下载了一些尺寸很大的图片,几千到一万像素都有,尺寸太大的时候,image load,开发板会out of memory,如何才能处理大图片使之可以被播放,或者什么情况下会预测到out of memory,谢谢了
离线hehui

只看该作者 7楼 发表于: 2010-04-19
用指针呢?
离线wangmuhai

只看该作者 6楼 发表于: 2010-04-14
开发板上的信息如下,我想能不能预测到load image会造成out of memory那我就不load,提示无法播放
后来我看源码,QImage.load(image)是使用QImageReader.read(image),然后是使用QImageIOHandler.read(image)
QImageIOHandler里的read函数是纯虚函数,可是查看qimageiohandler.cpp里面,找不到read函数


tango3[pdt]# free
                       total         used         free       shared      buffers
  Mem:       191728        92112        99616            0         2608
Swap:            0            0            0
Total:       191728        92112        99616
tango3[pdt]# get key: 000000100a 00 ENTER PDT


get key = 000000100a 00 ENTER PDT:KEYPAD_KEY5:0x01000005:Qt::NoModifier:0x00000000:0

[ItemClicked:3387]:

-----FilelistForm::ItemClicked, 2------

##### DEBUG #### [checkUsbCardReader:451]:[DeviceAutoDetection:] Check usb carder Reader
Set Display Background to 0
[PlayItem:4943]:

-----FilelistForm::PlayItem, 2------

"/media/USB/USB1_Disk1/IMAGES/Pics/pictures/Schmitt_Fingers_HiRes.jpg"


CCCCCCCCCCCCCCCCCCCCCCCCCCCC  playphoto


free

                        total         used         free       shared      buffers
  Mem:       191728       125712        66016            0         4496
Swap:            0            0            0
Total:       191728       125712        66016
tango3[pdt]# free
                       total         used         free       shared      buffers
  Mem:       191728       166688        25040            0         7056
Swap:            0            0            0
Total:       191728       166688        25040
tango3[pdt]# free
                        total         used         free       shared      buffers
  Mem:       191728       188304         3424            0          384
Swap:            0            0            0
Total:       191728       188304         3424
tango3[pdt]# printk: 6 messages suppressed.
desktop invoked oom-killer: gfp_mask=0xd0, order=0, oomkilladj=0
Call Trace:
[<8400fdfc>] dump_stack+0x8/0x34
[<84062568>] out_of_memory+0x2e0/0x358
[<84064b14>] __alloc_pages+0x3c8/0x3dc
[<840876e4>] cache_alloc_refill+0x37c/0x7d4
[<8408733c>] kmem_cache_alloc+0x74/0xa0
[<8412c650>] nfs_create_request+0x4c/0x1fc
[<8412e6c0>] readpage_async_filler+0xb4/0x238
[<8406790c>] read_cache_pages+0x114/0x168
[<8412e280>] nfs_readpages+0x118/0x1f0
[<84067130>] __do_page_cache_readahead+0x280/0x3a0
[<8405e884>] filemap_nopage+0x2a4/0x4d4
[<84070cdc>] __handle_mm_fault+0x178/0xe24
[<84013f94>] do_page_fault+0x144/0x3c0
[<840097a4>] ret_from_exception+0x0/0x10

Mem-info:
DMA per-cpu:
CPU    0: Hot: hi:   18, btch:   3 usd:   3   Cold: hi:    6, btch:   1 usd:   0
Active:10587 inactive:445 dirty:0 writeback:0 unstable:0
free:96 slab:649 mapped:21 pagetables:90 bounce:0
DMA free:1536kB min:2032kB low:2528kB high:3040kB active:169392kB inactive:7120kB present:261632kB pages_scanned:67179 all_unreclaimable? yes
lowmem_reserve[]: 0 0
DMA: 0*16kB 2*32kB 1*64kB 1*128kB 1*256kB 0*512kB 1*1024kB 0*2048kB 0*4096kB 0*8192kB 0*16384kB = 1536kB
Swap cache: add 0, delete 0, find 0/0, race 0+0
Free swap  = 0kB
Total swap = 0kB
Free swap:            0kB
16384 pages of RAM
0 pages of HIGHMEM
4401 reserved pages
77 pages shared
0 pages swap cached
Out of memory: kill process 885 (sh) score 1711 or a child
Killed process 1306 (desktop)


在开发板上是这些信息,播放图片前后free可以看出内存的使用情况,然后就out了...
[ 此帖被wangmuhai在2010-04-14 11:50重新编辑 ]
离线benbenmajia

只看该作者 5楼 发表于: 2010-04-14
调试的时候out of mem是在哪里?
安然.....
离线yangfanxing
只看该作者 4楼 发表于: 2010-04-13
看不出什么特别的东东。。。坐等。。。
PHPWind好恶心。。。不想看这种界面。。。
离线wangmuhai

只看该作者 3楼 发表于: 2010-04-13
void MediaPreviewForm::playPhoto(QString filename)
{
    QFile file(filename);
    QImageReader imageReader(filename);

    float scale = 1;
    //加个判断,如果图像尺寸大于4096,就缩放到4096,可是图像的大小好像没有变(不是指尺寸),这里应该怎么做吗?
    if (imageReader.size().width() > MAX_PHOTO_SIZE || imageReader.size().height() > MAX_PHOTO_SIZE)
    {
        scale = imageReader.size().width() > imageReader.size().height() ?
                MAX_PHOTO_SIZE/imageReader.size().width() :
                MAX_PHOTO_SIZE/imageReader.size().height();
        //QMatrix matrix;
        //matrix.scale(scale, scale);
        QSize imageSize = imageReader.size();
        qDebug()<<"imageSize"<<imageSize;
        imageSize.scale(imageSize.width()*scale, imageSize.height()*scale, Qt::KeepAspectRatio);
        //imageReader.setFormat("png");
        imageSize.scale(MAX_PHOTO_SIZE, MAX_PHOTO_SIZE, Qt::KeepAspectRatio);
        imageReader.setScaledSize(imageSize);
    }

    //qDebug()<<Q_ASSERT(image.load(filename));
    image = imageReader.read();

    int screenW = qApp->desktop()->size().width();
    int screenH = qApp->desktop()->size().height();

    float imageW = image.size().width();
    float imageH = image.size().height();

    scale = scalePhoto(screenW, screenH, imageW, imageH, PLAY_PHOTO);

    int scaleW = imageW*scale;
    int scaleH = imageH*scale;

/*
    QMatrix matrix;
    matrix.scale(scale, scale);
    image = image.transformed(matrix);
*/
    imageLabel->setPixmap(QPixmap::fromImage(image));

    imageLabel->setGeometry((screenW - scaleW)/2, (screenH - scaleH)/2, scaleW, scaleH);
    imageLabel->show();

    update();
}

代码在这里,老大帮我看看,谢谢了
[ 此帖被wangmuhai在2010-04-13 16:14重新编辑 ]
离线yangfanxing
只看该作者 2楼 发表于: 2010-04-13
How do you load an Image?
PHPWind好恶心。。。不想看这种界面。。。
离线wangmuhai

只看该作者 1楼 发表于: 2010-04-13
另外load之前,free看了一下,开发板上还有100M free的,图片大概是10M多,怎么就out of memory了...是不是和image尺寸大小有关系
快速回复
限100 字节
 
上一个 下一个