C# Как мой Bitmap использует другой MemoryStream, чем указанный? - PullRequest
0 голосов
/ 24 марта 2020

Я пишу обработчик, который создает два растровых изображения с помощью двух отдельных MemoryStreams, а затем возвращает одно из этих растровых изображений в качестве ответа ByteArrayContent.

К сожалению, независимо от того, какое растровое изображение я выбираю, ответ всегда является первым растровым изображением.

Например:

  • stream1 инициализируется из byteArray1. image1 инициализируется из stream1.
  • stream2 инициализируется из byteArray2. image2 инициализируется из stream2.

Я затем инициализирую finalImage из image1 или image2. После этого finalImage сохраняется в объекте FinalStream MemoryStream.

Затем finalStream возвращается как byteArray.

Примечание 1: Выше приведено только изображение image1. Даже если finalImage инициализируется с использованием image2.

Примечание 2: Если я удаляю весь код, относящийся к image1, изображение 2 возвращается, как и ожидалось.

Примечание 3: Этот блок кода в конечном итоге будет использоваться для возврата и image1, и image2 как объединенное изображение с двумя рядом друг с другом. К сожалению, это только когда-либо возвращало image1, поэтому мне пришлось реорганизовать код для дальнейшего изучения. Извиняюсь за беспорядок.

Примечание 4: Данные, возвращаемые GetTop5SuppliersChart, отличаются и могут быть видны по длине массива байтов.

Примечание 5: Я подумал, что это может быть проблема с кешированием, поэтому я попытался загрузить обработчик в режиме инкогнито и через разные браузеры без изменений в результате.

Приведенный ниже код был аннотирован длинами потоков

HttpResponse r = context.Response;
r.ContentType = "image/png";

byte[] byteArray1 = GetTop5SuppliersChart(brokerPerformanceEmailInformation, false);
//byteArray1.length is 22919
byte[] byteArray2 = GetTop5SuppliersChart(brokerPerformanceEmailInformation, true);
//byteArray2.length is 22375

Bitmap image1 = null;
Bitmap image2 = null;
byte[] chartImage = null;
using (MemoryStream stream1 = new MemoryStream(byteArray1))
{
    //stream1.length is 22919
    image1 = new Bitmap(stream1);

    using (MemoryStream stream2 = new MemoryStream(byteArray2))
    {
        //stream2.length is 22375
        image2 = new Bitmap(stream2);

        using (MemoryStream finalStream = new MemoryStream())
        {
            var finalImage = new Bitmap(image2);
            finalImage.Save(finalStream, System.Drawing.Imaging.ImageFormat.Png);  
            //finalStream.length is 127637

            byteArrayToReturn= finalStream.ToArray();
         }
     }
}
r.Write(new ByteArrayContent(byteArrayToReturn));

Метод GetTop5SuppliersGraphData возвращает разные данные как для image1, так и для image2.

private byte[] GetTop5SuppliersChart(BrokerPerformanceEmailInformation emailInformation, bool showCurrentMonth)
{
    var graphData = GetTop5SuppliersGraphData(emailInformation, showCurrentMonth);

    var myChart = new System.Web.Helpers.Chart(chartwidth, chartHeight, GetPieTheme(false))
    .AddSeries(chartType: "pie",
      xValue: graphData.Series,
      yValues: graphData.Values).Write();

    var chartBytes = myChart.GetBytes();
    return chartBytes;
}

Подводя итог:

Независимо от того, что используется для создания finalImage, byteArrayToReturn всегда будет возвращать image1.

...