在处置<某些位图>

时间:2019-07-26 23:29:25

标签: c# .net bitmap dispose

我正在将PDF页转换为DataGridView的小位图。我将每个页面转换为位图,然后将其分配给using(){}中的新创建的位图,就像可以在代码中读取的一样。

一旦我想将缩略图分配给using(){}中的DataGridView单元,就会得到一个“无效参数”。当我删除using(){}时,我没有收到该错误。但是我不想删除using(){},因为我希望正确处理(每个)位图。

我一直在Internet上进行搜索,大部分都被提到SO,而且我读了很多帖子,但是似乎没有什么问题是我的,到目前为止我还没有找到解决方案。

我删除了using()并将其替换为缩略图。Dispose()之后我在复制操作中使用了它,这自然带来了完全相同的问题。

如果不使用dispose(),我不会遇到问题,但是我将其留给GB进行清理,这不是正确的方法(我也在SO上阅读)。

编辑:添加了代码段所在的for循环。(不要紧记numberOfThumbnails变量,稍后我将其用于其他目的。)

EDIT2 :我想我找到了解决方案。我总是在第二次提到缩略图变量时才发生异常。因此,无论using(...)中的“位图缩略图= ...”语句如何,都使用了相同的变量。当我将分配更改为“新Bitmap(thumbnail);”时,问题就消失了,请参阅变体5。现在,我仍然怀疑此更改是否还会带来问题,因为我无法明确处理此新的位图... 有人可以解释一下它为什么起作用,以及是否可以安全使用(无需处置新创建的位图)吗?

// Variant one:
int numberOfThumbnails = 0;
for (int pageNumber = 1; pageNumber  <= PageCount; pageNumber++)
{
    using (Bitmap thumbnail = pdfDocument.PageToBitmap(pagenumber, width, height))
    {
    (row, col) = RowColFromLinearCellNumber(numberOfThumbnails++);
    if (col == 0)
        Rows.Add(thumbnail);
    else
        Rows[row].Cells[col].Value = thumbnail; // ERROR: Invalid Parameter
    }
}

// Variant two:
int numberOfThumbnails = 0;
for (int pageNumber = 1; pageNumber  <= PageCount; pageNumber++)
{
    using (Bitmap thumbnail = new Bitmap(pdfDocument.PageToBitmap(pagenumber, width, height)))
    {
    (row, col) = RowColFromLinearCellNumber(numberOfThumbnails++);
    if (col == 0)
        Rows.Add(thumbnail);
    else
        Rows[row].Cells[col].Value = new Bitmap(thumbnail); // ERROR: Invalid Parameter
    }
}

// Variant three:
int numberOfThumbnails = 0;
for (int pageNumber = 1; pageNumber  <= PageCount; pageNumber++)
{
    Bitmap thumbnail = new Bitmap(pdfDocument.PageToBitmap(pagenumber, width, height)))
    (row, col) = RowColFromLinearCellNumber(numberOfThumbnails++);
    if (col == 0)
        Rows.Add(thumbnail);
    else
        Rows[row].Cells[col].Value = new Bitmap(thumbnail); // ERROR: Invalid Parameter
    thumbnail.Dispose();
}

// Variant four:
int numberOfThumbnails = 0;
for (int pageNumber = 1; pageNumber  <= PageCount; pageNumber++)
{
    Bitmap thumbnail = new Bitmap(pdfDocument.PageToBitmap(pagenumber, width, height)))
    (row, col) = RowColFromLinearCellNumber(numberOfThumbnails++);
    if (col == 0)
        Rows.Add(thumbnail);
    else
        Rows[row].Cells[col].Value = new Bitmap(thumbnail); // NO error, but no disposal of Bitmap as well...
}

// Variant five:
int numberOfThumbnails = 0;
for (int pageNumber = 1; pageNumber  <= PageCount; pageNumber++)
{
    using (Bitmap thumbnail = pdfDocument.PageToBitmap(pagenumber, width, height))
    {
    (row, col) = RowColFromLinearCellNumber(numberOfThumbnails++);
    if (col == 0)
        Rows.Add(new Bitmap(thumbnail));
    else
        Rows[row].Cells[col].Value = new Bitmap(thumbnail); // No error anymore
    }
}

我希望所有变体都能正常工作(在功能上,忽略缺乏处置),但是在前三个变体中,我在要将缩略图放在DataGridView单元格的行上收到“无效参数”错误。

我在这个问题上花了很多时间,而且资源不足。我真的希望有人可以指出我忽略的错误。也许有人遇到了同样的问题,并且找到了一个好的解决方法。

0 个答案:

没有答案
相关问题