ImageMagic не может поймать исключение - PullRequest
0 голосов
/ 14 февраля 2019

Я сгенерировал миллионы bmp с помощью Imagemagick в Linux с многопоточным кодом, но по какой-то причине я получаю одну из этих ошибок (без трассировки стека), которую я не могу обработать:

dotnet: MagickCore/pixel.c:138: ClonePixelChannelMap: Assertion 'channel_map != (PixelChannelMap *) NULL' failed.

или

dotnet: MagickCore/semaphore.c:452: UnlockSemaphoreInfo: Assertion 'semaphore_info != (SemaphoreInfo *) NULL' failed.

или

dotnet: MagickCore/option.c:2137: CloneImageOptions: Assertion 'clone_info->signature == MagickCoreSignature' failed.

Мой блок try - catch не обрабатывает эти ошибки, поэтому моя программа закрывается немедленно.

Ошибки очень случайные, поскольку один и тот же вход для Imagemagick в другомпопытка проходит без ошибки.

Я использую Include = "Magick.NET-Q16-x64" Version = "7.11.0.0"

Я также пробую "Magick.NET-Q8-x64 "и предыдущие версии imagemagic с одинаковыми результатами.

Linux 4.18.0-3-amd64 # 1 SMP Debian 4.18.20-2 (2018-11-23) x86_64 GNU / Linux

Вот код из потока (я запускаю приложение с 9 потоками)

    public virtual void GeneratePictureForCurrSpin()
    {
        do
        {
            GenerateInternal();
        } while (!isAllPicturesGenerated());
    }

    public override void GenerateInternal()
    {
        symbols = symbolParser.ParseSymbols(config, spins[currLocalSpin].symbols);
        img = (MagickImage)SpinGenerator.rl.emptyImg.Clone();
        bgImg = SpinGenerator.rl.bg;
        img.Composite(bgImg, new PointD(config.BgX, config.BgY),ImageMagick.CompositeOperator.Over);
        reelsBgImg = SpinGenerator.rl.reelsBg;
        img.Composite(reelsBgImg, CompositeOperator.Over);
        PointD startPoint = new PointD(config.StartOffsetX, config.StartOffsetY);
        MagickImage sym;
        for(int i = 0; i < symbols.Count; i++)
        {
            List<int> symbolsOnReel = symbols[i];
            for(int j = 0; j < symbolsOnReel.Count; j++)
            {
                var newPoint = new PointD(startPoint.X + i * (config.SymbolWidth + config.OffsetX), startPoint.Y + j * (config.SymbolHeight + config.OffsetY));
                sym = SpinGenerator.rl.symbols[symbolsOnReel[j]-1];
                img.Composite(sym, newPoint, ImageMagick.CompositeOperator.Over);
            }
        }

        bool isFreeSpin = (spins[currLocalSpin].betValue == 0)?true:false; 
        GenerateBottomBar(isFreeSpin);
        ShowTokensValue(spins[currLocalSpin].coins);
        ResizeImage();
        int fileNr = spins[currLocalSpin].spinNr;
        String dir = "Resources/Result/" + GAME_NAME + "/" + betValue;
        SaveImg(dir , fileNr);
        img.Dispose();
        IncrementSpinValues();
    }


    public virtual void GenerateBottomBar(bool isFreeSpin)
    {
        var pos = (isFreeSpin)?1:0;
        bottomBar = SpinGenerator.rl.bottomBars[pos];
        PointD startPoint = new PointD(0,config.BgHeight);
        img.Composite(bottomBar,startPoint);
    }

    private void ShowTokensValue(int tokens)
    {
        if(tokens < 10)
        {
            var tokenValueImg = SpinGenerator.rl.tokensValues[tokens];
            tokenValueImg.Resize(90,60);
            img.Composite(tokenValueImg, new PointD(tokenValueStartX + tokenValueImgWidth, tokenValueStartY),ImageMagick.CompositeOperator.Over);
        }
        else{
            int a = tokens / 10;
            int b = tokens % 10;
            var tokenValueImgA = SpinGenerator.rl.tokensValues[a];
            tokenValueImgA.Resize(90,55);
            img.Composite(tokenValueImgA, new PointD(tokenValueStartX, tokenValueStartY),ImageMagick.CompositeOperator.Over);
            var tokenValueImgB = SpinGenerator.rl.tokensValues[b];
            tokenValueImgB.Resize(90,55);
            img.Composite(tokenValueImgB, new PointD(tokenValueStartX+ tokenValueImgWidth, tokenValueStartY),ImageMagick.CompositeOperator.Over);
        }
        var tokensTxtImg = SpinGenerator.rl.tokensTxt;
        img.Composite(tokensTxtImg, new PointD(tokenTxtStartX, tokenTxtStartY),ImageMagick.CompositeOperator.Over);
    }

    internal void ResizeImage()
    {
        img.Format = ImageMagick.MagickFormat.Bmp3;
        img.Depth = 16;
        img.Resize(new MagickGeometry("600, 450!"));
        //img.Quality = 100;
    }

    internal void SaveImg(String dir , int fileNr)
    {
        System.IO.Directory.CreateDirectory(dir);
        img.Write(dir + "/" +"s" + fileNr + ".bmp");
        ClearImg();
    }

    internal virtual void IncrementSpinValues()
    {
        currLocalSpin++;
        currSpin++;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...