GDI+, сохранение файла в нужном формате пикселя.

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

GDI+, сохранение файла в нужном формате пикселя.

Сообщение Mikle » 25.10.2011 (Вт) 14:27

У меня имеется массив с графическими данными в формате 32bppRGB, создаю из массива битмап с форматом PixelFormat32bppRGB (не PixelFormat32bppARGB) с помощью GdipCreateBitmapFromScan0, потом сохраняю в файл при помощи GdipSaveImageToFile. Если выбран тип файла, где возможен альфаканал, то сохраняется файл именно с альфаканалом, хотя он не нужен, если выбрать, например, Jpeg, то нормально сохраняется RGB.
А в GIF наоборот сохраняется без альфы, хотя она там возможна, даже если задаю формат битмапа PixelFormat32bppARGB.
Вот весь код:
Код:
Код: Выделить всё
Public Sub SaveToFile(fName As String, fFormat As SR2D_FileFormat, Optional ByVal JPGQuality As Long = 80)
  Dim tSI As GdiplusStartupInput
  Dim Res As Long
  Dim GDIP As Long
  Dim Bmp As Long
  Dim tEncoder As CLSID
  Dim tParams As EncoderParameters
  Dim sType As String

  tSI.GdiplusVersion = 1
  Res = GdiplusStartup(GDIP, tSI)
  If Res = 0 Then
    Res = GdipCreateBitmapFromScan0(Width, Height, Width * 4, PixelFormat32bppRGB, cBuf(0), Bmp)
    If Res = 0 Then
      Select Case fFormat
        Case ffBMP: sType = "{557CF400-1A04-11D3-9A73-0000F81EF32E}"
        Case ffJPG: sType = "{557CF401-1A04-11D3-9A73-0000F81EF32E}"
          tParams.count = 1
          tParams.Parameter.NumberOfValues = 1
          tParams.Parameter.type = 4
          tParams.Parameter.value = VarPtr(JPGQuality)
          CLSIDFromString StrPtr("{1D5BE4B5-FA4A-452D-9CDD-5DB35105E7EB}"), tParams.Parameter.GUID
        Case ffGIF: sType = "{557CF402-1A04-11D3-9A73-0000F81EF32E}"
        Case ffPNG: sType = "{557CF406-1A04-11D3-9A73-0000F81EF32E}"
      End Select
      CLSIDFromString StrPtr(sType), tEncoder
      Res = GdipSaveImageToFile(Bmp, StrPtr(fName), tEncoder, tParams)
      GdipDisposeImage Bmp
    End If
    GdiplusShutdown GDIP
  End If
End Sub

Подскажите решение. Где я что-то не учёл?

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: GDI+, сохранение файла в нужном формате пикселя.

Сообщение djalex777 » 26.10.2011 (Ср) 13:03

В GIF-формате нет альфа-составляющей. Там назначается цвет, который будет считаться прозрачным (т.е. либо прозрачный, либо нет).

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: GDI+, сохранение файла в нужном формате пикселя.

Сообщение Mikle » 26.10.2011 (Ср) 13:22

Это понятно, такое легко трансформируется в однобитную альфу. Но GIF мне не столь важен, как BMP и PNG без альфы. В общем-то я могу сам сконвертировать данные в PixelFormat24bppRGB, тогда всё сохраняется, как нужно, но для чего-то же создан формат PixelFormat32bppRGB?

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: GDI+, сохранение файла в нужном формате пикселя.

Сообщение djalex777 » 26.10.2011 (Ср) 21:10

Ну поэтому GIF и сохраняется без альфы, т.к. её и нет там. А что записывается при PixelFormat32bppRGB в альфу? Реальное значение или какая-нибудь постоянная (типа 0 или 255)?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: GDI+, сохранение файла в нужном формате пикселя.

Сообщение Mikle » 27.10.2011 (Чт) 8:54

В том то и дело, что попадает реальное содержимое четвёртого байта, как будто между форматами PixelFormat32bppARGB и PixelFormat32bppRGB нет разницы.

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: GDI+, сохранение файла в нужном формате пикселя.

Сообщение djalex777 » 27.10.2011 (Чт) 14:25

Может быть этот формат влияет только на отрисовку? Т.е. PixelFormat32bppARGB будет рисовать с альфой, а PixelFormat32bppRGB - без альфы. Нет возможности проверить, поэтому спрашиваю.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 27.10.2011 (Чт) 14:29

Не разбирался в коде, но всё-таки спрошу: а битмап пересоздаётся на основе вытащенных данных, или они просто так вытаскиваются? Если второе, то вполне логично что все данные сохраняются.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: GDI+, сохранение файла в нужном формате пикселя.

Сообщение Mikle » 27.10.2011 (Чт) 15:07

Битмап создаётся (не пере-) из обычного массива. При создании я ему даю флаг PixelFormat32bppRGB, то есть это RGB, но занимают 4 байта на пиксель, в четвёртом байте мусор. Если это не так, то зачем тогда вообще нужен этот формат, где его применять?
Может быть этот формат влияет только на отрисовку? Т.е. PixelFormat32bppARGB будет рисовать с альфой, а PixelFormat32bppRGB - без альфы.

Интересное предположение. Но ведь JPG из него сохраняется нормально, не ругается, что альфу девать некуда...

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 27.10.2011 (Чт) 15:12

Mikle писал(а):RGB, но занимают 4 байта на пиксель

В .NET 3 бата для RGB. Может стоит использовать другой массив?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: GDI+, сохранение файла в нужном формате пикселя.

Сообщение Mikle » 27.10.2011 (Чт) 15:21

Qwertiy писал(а):Может стоит использовать другой массив?

С таким массивом скорость работы гораздо выше, для чего этот формат и придумали. Да и альфа мне иногда бывает нужна, не делать же разные форматы для разных случаев. Мне не сложно перед созданием битмапа конвертнуть данные в 24 бита на пиксель, и битмап создать с флагом PixelFormat24bppRGB. Я так и сделаю, если пойму, что от PixelFormat32bppRGB толку нет.

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: GDI+, сохранение файла в нужном формате пикселя.

Сообщение VBTerminator » 29.10.2011 (Сб) 14:50

Да как изображение будет сохраняться в RGB (3 байта на пиксель), если указано PixelFormat32bppRGB (4 байта на пиксель), то есть цветовая модель - xRGB?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: GDI+, сохранение файла в нужном формате пикселя.

Сообщение Mikle » 29.10.2011 (Сб) 15:53

VBTerminator писал(а):как изображение будет сохраняться в RGB (3 байта на пиксель)

А как в jpg сохраняется?
VBTerminator писал(а):если указано PixelFormat32bppRGB (4 байта на пиксель), то есть цветовая модель - xRGB?

У ФАЙЛОВ нет такого формата, он есть только у битмапа. То есть при сохранении такой битмап в любом случае будет трансформироваться. На практике получается, что он трансформируется в 32bppARGB, хотя логичнее было бы в 24bppRGB.


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19

    TopList  
cron