Преобразовать 24-разрядный bmp в 16-разрядный?

Я знаю, что Платформа.NET идет с классом преобразования изображения (Система. Рисование. Изображение. Сохраните метод).

Но я должен преобразовать 24-разрядное растровое изображение (R8G8B8) в 16-разрядное (X1R5G5B5), и я действительно не получил идеи об этом виде преобразования, и изменение 24-to-16-bit в bmp заголовке не будет работать (так как мы должны преобразовать все данные изображения).

Также я хотел бы знать, могу ли я управлять по Размытию изображения и т.д.

Идеи? Любой вид справки ценился бы.

11
задан dtb 4 March 2010 в 11:09
поделиться

3 ответа

Формат пикселей Format16bppRgb1555 объявлен, но GDI+ фактически не поддерживает его. Не существует ни одного видеодрайвера или кодека изображения, который когда-либо использовал бы этот формат пикселей. Что-то, о чем разработчики GDI+ догадывались, могло произойти, но их машина времени не была достаточно точной. В противном случае это довольно небрежная копия/вставка от программиста, который работал над System.Drawing.

Rgb555 является наиболее близким для доступного оборудования и кодеков:

public static Bitmap ConvertTo16bpp(Image img) {
    var bmp = new Bitmap(img.Width, img.Height,
                  System.Drawing.Imaging.PixelFormat.Format16bppRgb555);
    using (var gr = Graphics.FromImage(bmp))
        gr.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height));
    return bmp;
}
20
ответ дан 3 December 2019 в 05:12
поделиться

Вам нужно сохранить растровое изображение с параметром Encoder, указывающим глубину цвета.

    myEncoder = Encoder.ColorDepth;
    myEncoderParameters = new EncoderParameters(1);

    // Save the image with a color depth of 24 bits per pixel.
    myEncoderParameter = new EncoderParameter(myEncoder, 24L);
    myEncoderParameters.Param[0] = myEncoderParameter;

    myBitmap.Save("MyBitmap.bmp", myImageCodecInfo, myEncoderParameters);
1
ответ дан 3 December 2019 в 05:12
поделиться

Действительно простой способ сделать это - перебрать старые растровые данные и преобразовать каждую пару значений r8-g8-b8 в x1-r5-g5-b5, что-то вроде этой функции:

char condense(char i)
{ 
  return (char)(i*255.0f/31.0f);
}

short transform(long input)// note that the last 8 bytes are ignored
{
  return condense(input&0xff) || (condense((input&0xff00)>>8)<<5)
    || (condense((intput&0xff0000)>>16)<<10);
}

// and somewhere in your program
{
  int len; // the length of your data in pixels
  char *data; // your data
  char *newdata; // this is where you store the new data; make sure it's allocated

  for(char *p=data; p<data+len*3; p+=3)
    *(short *)newdata=transform(*(long *)data);
}
1
ответ дан 3 December 2019 в 05:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: