AMcoder - javascript, python, java, html, php, sql

OutOfMemoryException-ը մեծ պատկեր է բեռնում Bitmap օբյեկտում Compact Framework-ով

Ես խնդիր ունեմ հիշողության արտահոսքի հետ:

Ես ունեմ այս կոդը button_click-ում.

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

    Dim ms As New IO.MemoryStream
    Dim bm As New Bitmap("\Application Data\imgs\IMG22.jpg")
    bm.Save(ms, Drawing.Imaging.ImageFormat.Jpeg)
End Sub

Այս կոդը լավ է աշխատում, երբ ես աշխատում եմ .exe-ն իմ նոութբուքում (նկատի ունեմ windows7/32bits-ի տակ՝ ամբողջական .net շրջանակով), բայց երբ ես գործարկում եմ հավելվածը WindowsMobile 6.1 սարքում, հավելվածը բացառություն է անում.

SmartDeviceProject22.exe
OutOfMemoryException

at

Microsoft.AGL.Common.MISC.HandleAr(PAL_ERROR ar)
at
System.Drawing.Image.Save(Stream stream, ImageFormat format)
at
SmartDeviceProject22.Form1.Button3_Click(Object sender, EventArgs e)
at
....

Պատկերի չափը մոտ 200 կբ է, իսկ լայնությունն ու բարձրությունը՝ մոտ 1500 պիքսել: Պատկերի մանրամասները.

  • Չափսը՝ 1536x2048
  • Հորիզոնական լուծում՝ 72dpi
  • Հորիզոնական լուծում՝ 72dpi
  • Բիտի խորությունը՝ 24
  • Լուծման միավոր՝ 2
  • Գույնի ներկայացում: sRGB -

Ցանկացած օգնություն այն իսկապես կգնահատվի:

Փորձում եմ @asawyer-ի կոդը, նույնիսկ հանում եմ ԲՈԼՈՐ կոդը, հղումը և այլն, և խնդիրը պահպանվում է, ենթադրում եմ, որ դա պատկերի լայնության/բարձրության կամ կոմպակտ շրջանակի հետ կապված է:

Որևէ այլ խորհուրդ:

Խնդրի լուծում և բացատրություն Փորձելուց հետո ինչ-որ բան իրական խնդիր էր, դա հիշողության արտահոսք չէր, ինչպես @pdriegen-ն ասաց, որ առկա է հիշողության խնդիր:

Ես փոխում եմ իմ կոդը հետևյալի վրա (և փորձարկվել է բջջային սարքում).

 Dim fs As IO.FileStream = IO.File.OpenRead("\Application Data\ryder\IMG23.jpg")
 Dim arrb(fs.Length) As Byte     
 fs.Read(arrb, 0, arrb.Length)
 fs.Close()
 fs.Dispose()

Եվ վերևի կոդով (ըստ երևույթին) ես ստանում եմ պատկերի բայթ() (զանգված) տվյալների բազայում պահելու համար՝ օգտագործելով dataSet:

Եզրափակելով. բեռնել bitmap օբյեկտը memoryStream-ում, վատ գաղափար: Շատ շնորհակալություն բոլորին, ովքեր ժամանակ են տրամադրում իմ խնդիրը կարդալու համար, և հատկապես նրանց, ովքեր տեղադրում են իրենց պատասխանը:

Լուծում (եթե ձեզ անհրաժեշտ է պատկերը ցուցադրել նկարի վանդակում).

Մի քանի շաբաթ անց սա, հավանաբար, լավագույն (անվճար) լուծումն է՝ կիրառեք ImageHelper, ինչպես բացատրված է այստեղ՝ ImageHelper

թարմացված հղում դեպի ImageHelper https://opennetcf.com/2010/10/13/loading-parts-of-large-images-in-the-compact-framework/

Այս դասը/նմուշը օգտագործում է Drawing NameSpace-ը OpenNetCF-ից (http://www.opennetcf.com/)

Այն հիանալի է աշխատում և լուծում է իմ հիշողության խնդիրները՝ մեծ բիթքարտեզներ հիշողության մեջ բեռնելով, իրականում մենք բեռնում ենք մանրապատկեր, այնպես որ հիշողության չափը զգալիորեն կրճատվում է և խուսափել OutOfMemory բացառության խնդրից:

Chris Tacke-ի մասին Ես պարզապես հասկացա, որ ImageHelper-ի և OpenNetCF-ի համահիմնադիրի մասին գրառման հեղինակն այստեղ է stackoverflow-ում, ահա նրա պրոֆիլը՝ https://stackoverflow.com/users/13154/ctacke

թարմացված հղում https://opennetcf.com/2010/10/13/loading-parts-of-large-images-in-the-compact-framework/


Պատասխանները:


1

Չեմ հավատում, որ խնդիրը հիշողության արտահոսքի մեջ է: Փոխարենը խնդիրը հասանելի հիշողության բացակայությունն է:

Թեև սեղմված պատկերի չափը 200 կբ է, երբ այն բեռնում եք որպես բիթքարտեզ, այն կկտրվի և կպահվի հիշողության մեջ բնիկ Bitmap ձևաչափով: Հաշվի առնելով յուրաքանչյուրը 1500px բարձրությունը և լայնությունը, և ենթադրելով 32bpp բիթքարտեզի ձևաչափ (կանխադրվածը, երբ նշված չէ), դուք դիտում եք հատկացված 9MB հիշողություն:

1500 * 1500 * 4 = 9MB.

Հաշվի առնելով շարժական սարքի ՕՀ-ում առկա հիշողության սահմանափակումները (32 ՄԲ/գործընթաց՝ համակարգային dll-ների կողմից հատկացված տարածք), դուք կարող եք հայտնվել հիշողության խզման սցենարի մեջ: Ինձ համար, իհարկե, անհայտ է, թե ինչ այլ հիշողություն է հատկացվում այն ​​հավելվածին, որտեղ դուք օգտագործում եք այս կոդը:

Փորձեք նույն կոդը նույն սարքում՝ ավելի փոքր պատկերով: Դուք պետք է տեսնեք, որ այն լավ է աշխատում:

14.06.2012
  • Օհհ, հիանալի է, ես դրա մասին ինչ-որ բան կարդացի այստեղ հղում Թույլ տվեք փորձել ավելի փոքր պատկերով, բայց հետո դա անելու միջոց չկա, ես պետք է պատկերը փոխանցեմ բայթային զանգվածին` այն պահելու համար: տվյալների բազան, իրականում այն ​​աշխատում է համակարգչի վրա (կարծում եմ, որ ես կարող եմ չարաշահել հիշողությունը), բայց ես այս խնդիրը ստացել եմ բջջային սարքի վրա: 14.06.2012
  • Եթե ​​ձեզ պարզապես անհրաժեշտ է փոխանցել jpeg-ը որպես բայթ զանգված, ինչո՞ւ պարզապես չեք օգտագործում FileStream օբյեկտը՝ բայթի տվյալները ֆայլից անմիջապես կարդալու համար, այլ ոչ թե սկզբում դեսեղմեք բիթքարտեզում: 14.06.2012
  • երևի այն պատճառով, որ ես պատկերացում չունեմ, թե ինչ եմ անում, մի տեսակ, թույլ տվեք փորձեմ, բայց մինչ այդ դուք ճիշտ էիք, ես նոր փորձարկեցի 400x400 պատկերով և բացառություն չստացվեց: 14.06.2012

  • 2

    Ձեր արտահոսող Gdi կարգավորումները, փաթեթավորեք հոսքը և բիթքարտեզը Օգտագործելով կետերում:

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    
        using ms As New IO.MemoryStream
            using bm As New Bitmap("\Application Data\imgs\IMG22.jpg")
                bm.Save(ms, Drawing.Imaging.ImageFormat.Jpeg)
            end using
        end using
    
    End Sub
    
    14.06.2012
  • Ողջույն @asawyer Oamm, ես իսկապես չեմ հասկանում ձեզ, բայց նույնիսկ փաթաթելով հոսքը և բիթքարտեզը (ճիշտ այնպես, ինչպես դուք ցույց եք տալիս ինձ), հավելվածը նույն բացառությունն է անում, երբ այն աշխատում է սարքի վրա: 14.06.2012
  • @Allende pdriegen-ը հավանաբար ճիշտ է, բայց սա նույնպես կարող էր նպաստել: 14.06.2012
  • Ողջույն @asawyer, կներեք, որ կոպիտ չէի, բայց եթե ես լավ հասկացա, որ փաթեթավորումը օգտագործելով օբյեկտները օգնում է ազատել ռեսուրսները, ապա մի բան, ինչպիսին է օգտագործման .dispose() մեթոդը: Կամ ես դեռ կորած եմ: 14.06.2012
  • @Allende using-ն այն կվերածի փորձի/վերջապես արգելափակման, որն ավտոմատ կերպով կանչում է Dispose() օբյեկտի համար: Գործարկման ժամանակն անկասկած կկարգավորի այս բաները ձեզ համար, բայց երբեմն ձեզ անհրաժեշտ է արագ ազատել այդ ռեսուրսը, ինչպես հիշողության սթրեսային իրավիճակներում: Windows-ի հոսքերը և բիթքարտեզները հատկացնում են OS-ի հիմքում ընկած օբյեկտները, որոնք չեն թողարկվի, քանի դեռ GC-ն չի վերցնի դրանք ապագայում ինչ-որ պահի, եթե դրանց վրա չկանչեք Dispose: 14.06.2012
  • Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..