Страница 1 из 1

FreeImage: конвертация BMP -> JPG

Добавлено: 02 Февраль 2012, 10:03
Дед Пахом
По условию задачи мне надо сохранить bmp-файл как jpg. Вот код:

Код: Выделить всё

BmpClass.SaveAs     PROCEDURE(STRING pFile)
fif                   FREE_IMAGE_FORMAT
dib                   LPFIBITMAP
saveAsFile            CSTRING(256)

bOK                   BOOL(FALSE)

  CODE
  saveAsFile = PATH() & '\' & CLIP(pFile)

  fif = FreeImage_GetFIFFromFilename(self.FileName);
  dib = FreeImage_Load(fif, self.FileName)
  IF dib = 0
    self.ErrorHandler('Failed loading')
    RETURN
  END
  
  IF FreeImage_FIFSupportsWriting(fif) AND FreeImage_FIFSupportsExportBPP(fif, FreeImage_GetBPP(dib))

    fif = FreeImage_GetFIFFromFilename(saveAsFile);
  
    bOK = FreeImage_Save(fif, dib, saveAsFile)
    IF NOT bOK
      message('Failed saving')
      self.ErrorHandler('Failed saving')
    END

    FreeImage_Unload(dib)
  ELSE
    STOP('error')
  END
Код вроде рабочий, конвертит bmp во всё что угодно (png, tiff...). Во всё, кроме jpg! FreeImage_Save('image.jpg') возвращает 0, файл image.jpg создаётся, но он пустой. Никто не сталкивался?

Re: FreeImage: конвертация BMP -> JPG

Добавлено: 02 Февраль 2012, 10:27
seawolf
У меня есть аналогичное преобразование из PNM в BMP с рихтовкой на 300 точек по дороге, работает без проблем довольно давно (смотри внизу). Также где-то был кусок где в загруженное в память bmp там -же в памяти преобразуется в Jpg и вставляется в blob (без сохранения на диск промежуточнывх файлов)

pImage = FreeImage_Load(RETFIF,PATH_PNM,0)
If pImage <> 0
bWidth = FreeImage_GetWidth(pImage)
bHeight = FreeImage_GetHeight(pImage)
FreeImage_SetDotsPerMeterX(pImage,11811)
FreeImage_SetDotsPerMeterY(pImage,11811)
bResult = FreeImage_Save(FIF_BMP,pImage,PATH_BMP,0)
.

вот нашел в jpg из bmp но в памяти

hMem1 - ссылка на Bmp в памяти

cbImage = GlobalSize(hMem1)
lpBuffer = GlobalLock(hMem1)
If lpBuffer <> 0
fihMemory = FreeImage_OpenMemory(lpBuffer, cbImage)
IF fihMemory <> 0
fif = FreeImage_GetFileTypeFromMemory(fihMemory, 0)
If fif <> FIF_UNKNOWN And FreeImage_FIFSupportsReading(fif)
pImage = FreeImage_LoadFromMemory(fif, fihMemory, LoadOption)
If pImage
hMem2 = FreeImage_OpenMemory()
If hMem2
If FreeImage_SaveToMemory(FIF_JPEG,pImage,hMem2,0) = true
mem_buffer = 0; size_in_bytes = 0
If FreeImage_AcquireMemory(hMem2, mem_buffer, size_in_bytes) = True
?Image2{PROP:ImageBlob} = mem_buffer
. .
.
FreeImage_CloseMemory(hMem2)
FreeImage_UnLoad(pImage)
.
.
FreeImage_CloseMemory(fihMemory)
.
.
GlobalUnlock(hMem1)
GlobalFree(hMem1)

Re: FreeImage: конвертация BMP -> JPG

Добавлено: 02 Февраль 2012, 17:41
Дед Пахом
Спасибо огромное. Всё дело (видимо) в том, что bmp получается 32 bits per pixel, и в jpg такой имидж почему-то не конвертится. Сделал bmp 24 bits per pixel, всё ok.