Графика DrawImage полностью прозрачна после преобразования в растровое изображение - PullRequest
0 голосов
/ 29 октября 2010

Немного предыстории: в настоящее время я пытаюсь загрузить текстуру с помощью OpenTK, поэтому я нахожу следующую степень 2 (512,1024 и т. Д.) И создаю новое растровое изображение с таким размером и рисую исходное растровое изображение на:

Bitmap bmp = new Bitmap(filename);
width = bmp.Width;
height = bmp.Height;
int w2 = (int)PowerOf2(width);
int h2 = (int)PowerOf2(height);
Bitmap bmp2 = new Bitmap(w2, h2);
Graphics gfx = Graphics.FromImage(bmp2);
gfx.DrawImage(bmp, new Point(0,0));     
bmp = new Bitmap(w2, h2, gfx);
bmp.Save("save.bmp");

Когда я открываю изображение, оно становится прозрачным. Кто-нибудь знает, почему это так?

Ответы [ 2 ]

0 голосов
/ 29 октября 2010

В строке 8 вы рисуете bmp на bmp2.Все, что вы делаете потом с помощью gfx, по-прежнему влияет на bmp2.

В строке 9 вы создали новое растровое изображение и присвоили gfx растровому изображению, подразумевая, что вы будете рисовать на bmp с gfx (что вы не сделали в любом случае).Затем вы переходите к сохранению bmp, которое дало вам пустое или, как вы его описали, «прозрачное» изображение.

Если вы пытаетесь удвоить размер изображения, вы можете пересмотреть кодк чему-то в этом роде:

Private Sub DrawNewImage()
    Dim bmp = New Bitmap("C:\Path\to\file.bmp")
    Dim Width = bmp.Width
    Dim Height = bmp.Height
    Dim w2 As Integer = PowerOf2(Width)
    Dim h2 As Integer = PowerOf2(Height)

    Dim bmp2 = New Bitmap(w2, h2)
    Dim gfx = Graphics.FromImage(bmp2)

    gfx.DrawImage(bmp, 0, 0, w2, h2)
    bmp2.Save("C:\Path\to\saved\file.bmp")
End Sub

Private Function PowerOf2(ByVal value As Integer) As Integer
    Return value * value
End Function

или вы можете попробовать преобразованную версию C #:

private void DrawNewImage()
{
    Bitmap bmp = new Bitmap("C:\\Path\\to\\file.bmp");
    int Width = bmp.Width;
    int Height = bmp.Height;
    int w2 = PowerOf2(Width);
    int h2 = PowerOf2(Height);

    Bitmap bmp2 = new Bitmap(w2, h2);
    Graphics gfx = Graphics.FromImage(bmp2);

    gfx.DrawImage(bmp, 0, 0, w2, h2);
    bmp2.Save("C:\\Path\\to\\saved\\file.bmp");
}

private int PowerOf2(int value)
{
    return value * value;
}
0 голосов
/ 29 октября 2010

Когда вы делаете это:

bmp = new Bitmap(w2, h2, gfx);

вы фактически не создаете копию растрового изображения, которое использует ваш объект Graphics, а просто используете его спецификации для создания нового пустого.Графика напрямую манипулирует растровым изображением.Вам не нужно «получать» его обратно.Избавьтесь от этой строки и предыдущей и сохраните вместо нее bmp2, и она должна работать.

...