压缩具有高压缩级别的JP2(JPEG2000)图像

时间:2012-06-20 13:50:34

标签: c# .net http-compression image-conversion jpeg2000

从数据库读取图像后,我需要将该图像转换为JP2(JPEG2000)

更新

我使用FreeImage将图像转换为JP2

   // Load bitmap           
   FIBITMAP dib = FreeImage.LoadEx(imageName);
// Check success
if (dib.IsNull)
{
    MessageBox.Show("Could not load Sample.jpg", "Error");
    return;
}    

// Convert Bitmap to JPEG2000 and save it on the hard disk
FreeImage.Save(FREE_IMAGE_FORMAT.FIF_JP2, dib, "Image.jp2", FREE_IMAGE_SAVE_FLAGS.DEFAULT);

// Unload source bitmap
FreeImage.UnloadEx(ref dib);

现在,我需要以高压缩级别压缩此图像!

2 个答案:

答案 0 :(得分:4)

我找到了答案

   // Load bitmap           
   FIBITMAP dib = FreeImage.LoadEx(imageName);
    //
    Check success
    if (dib.IsNull)
    {
        MessageBox.Show("Could not load Sample.jpg", "Error");
        return;
    }    

    // Convert Bitmap to JPEG2000 and save it on the hard disk
    FreeImage.Save(FREE_IMAGE_FORMAT.FIF_JP2, dib, "Image.jp2", FREE_IMAGE_SAVE_FLAGS.EXR_PXR24 | FREE_IMAGE_SAVE_FLAGS.EXR_LC);

    // Unload source bitmap
    FreeImage.UnloadEx(ref dib);

答案 1 :(得分:0)

JP2(和J2K)格式的标志简单地解释为缩减因子。这是来自PluginJP2.cpp源

// if no rate entered, apply a 16:1 rate by default
if(flags == JP2_DEFAULT) {
    parameters.tcp_rates[0] = (float)16;
} else {
    // for now, the flags parameter is only used to specify the rate
    parameters.tcp_rates[0] = (float)(flags & 0x3FF);
}

因此,您实际上可以指定减少率高达1023:1:

// Load bitmap           
FIBITMAP dib = FreeImage.LoadEx(imageName);
// Check success
if (dib.IsNull)
{
    MessageBox.Show("Could not load Sample.jpg", "Error");
    return;
}    

// Convert Bitmap to JPEG2000 and save it on the hard disk
FreeImage.Save(FREE_IMAGE_FORMAT.FIF_JP2, dib, "Image.jp2", (FREE_IMAGE_SAVE_FLAGS)1023);

// Unload source bitmap
FreeImage.UnloadEx(ref dib);

这将为您提供非常小的非常低质量的文件。