Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2012, 16:01   #1
arxlex
Пользователь
 
Регистрация: 18.01.2012
Сообщений: 23
По умолчанию RGB: Преобразование RAW в rgb24

Код:
function RGBA(r, g, b, a: Byte): COLORREF;
begin
  Result := (r or (g shl 8) or (b shl 16) or (a shl 24));
end;

function rgb565toImage1(data: string; bytesperpixel, width, height, redOffset, redSize, blueOffset, blueSize, greenOffset, greenSize, alfaOffset, alfaSize: integer): TBitMap;
var
  Bmp: TBitMap;
  i, j, k: cardinal;
  temp, alfa, red, green, blue: cardinal;
  a: Char;
begin
  Bmp := TBitMap.Create;
  Bmp.height := height;
  Bmp.width := width;
  Bmp.PixelFormat := pf32bit;

  for i := 0 to Bmp.height - 1 do
  begin
    for j := 0 to Bmp.width - 1 do
    begin
      temp := 0;
      for k := 0 to bytesperpixel do
      begin
        temp := temp shl 8;
        a := data[i * width * bytesperpixel + j * bytesperpixel + 3 + k];
        temp := temp or orD(a);
      end;

      red := (temp and (($FF shr (8 - redSize)) shl redOffset)) shr redOffset;
      green := (temp and (($FF shr (8 - greenSize)) shl greenOffset)) shr greenOffset;
      blue := (temp and (($FF shr (8 - blueSize)) shl blueOffset)) shr blueOffset;
      alfa := (temp and (($FF shr (8 - alfaSize)) shl alfaOffset)) shr alfaOffset;

      red := (red shl (8 - redSize)) or (red shr (redSize - (8 - redSize)));
      green := (green shl (8 - greenSize)) or (green shr (greenSize - (8 - greenSize)));
      blue := (blue shl (8 - blueSize)) or (blue shr (blueSize - (8 - blueSize)));
      alfa := (alfa shl (8 - alfaSize)) or (alfa shr (alfaSize - (8 - alfaSize)));

      Bmp.Canvas.Pixels[j, i] := RGBA(red, green, blue, alfa);
    end;
  end;
  Result := Bmp;
end;
или

Код:
//Code by GunSmoker
function rgb565toImage2(data: string; bytesperpixel, width, height, redOffset, redSize, blueOffset, blueSize, greenOffset, greenSize, alfaOffset, alfaSize: integer): TBitMap;
CONST
  PixelCountMax = 32768;
TYPE
  pRGBQuadArray = ^TRGBQuadArray;
  TRGBQuadArray = ARRAY [0 .. PixelCountMax - 1] OF TRGBQuad;
var
  Bmp: TBitMap;
  i, j: cardinal;
  temp, alfa, red, green, blue: cardinal;
  r: pRGBQuadArray;
begin
  Bmp := TBitMap.Create;
  Bmp.SetSize(width, height);
  Bmp.HandleType := bmDIB;
  Bmp.PixelFormat := pf32bit;
  for i := 0 to Bmp.height - 1 do
  begin
    r := Bmp.ScanLine[i];
    for j := 0 to Bmp.width - 1 do
    begin
      case bytesperpixel of
        1:
          temp := PByte(@data[i * width * bytesperpixel + j * bytesperpixel + 1])^;
        2:
          temp := PWord(@data[i * width * bytesperpixel + j * bytesperpixel + 1])^;
        4:
          temp := PCardinal(@data[i * width * bytesperpixel + j * bytesperpixel + 1])^;
      else
        Assert(False);
      end;

      red := (temp and (($FF shr (8 - redSize)) shl redOffset)) shr redOffset;
      green := (temp and (($fF shr (8 - greenSize)) shl greenOffset)) shr greenOffset;
      blue := (temp and (($ff shr (8 - blueSize)) shl blueOffset)) shr blueOffset;
      alfa := (temp and (($ff shr (8 - alfaSize)) shl alfaOffset)) shr alfaOffset;

      red := (red shl (8 - redSize)) or (red shr (redSize - (8 - redSize)));
      green := (green shl (8 - greenSize)) or (green shr (greenSize - (8 - greenSize)));
      blue := (blue shl (8 - blueSize)) or (blue shr (blueSize - (8 - blueSize)));
      alfa := (alfa shl (8 - alfaSize)) or (alfa shr (alfaSize - (8 - alfaSize)));

      Bmp.Canvas.Pixels[j, i] := RGBA(red, green, blue, alfa);
    end;
  end;
  Result := Bmp;
end;
Код:
var
    FileStream: TFileStream;
    StrStream: TStringStream;
...
FileStream := TFileStream.Create(OpenDialog1.FileName, fmShareExclusive);
    FileStream.Position := 0;
    StrStream.LoadFromStream(FileStream);
    Image1.Picture.Graphic := nil;
    Image1.Picture.Bitmap := rgb565toImage1(StrStream.DataString, bytesperpixel, width, height, redOffset, redSize, blueOffset, blueSize,
                greenOffset, greenSize, alfaOffset, alfaSize);
Код:
            bytesperpixel :=  4;
            width :=  800;
            height :=  480;
            redOffset :=  0;
            redSize :=  8;
            blueOffset :=  16;
            blueSize :=  8;
            greenOffset :=  8;
            greenSize :=  8;
            alfaOffset :=  24;
            alfaSize :=  8;
Не могу понять почему не получется получить нормальное изображение. В каком месте я допустил ошибку?

Оригинальное изображение и RAW изображение можете посмотреть в аттаче
Изображения
Тип файла: jpg 20120417200020.jpg (18.2 Кб, 163 просмотров)
Вложения
Тип файла: rar raw.rar (78.9 Кб, 30 просмотров)
Mess With the Best, Die Like the Rest

Последний раз редактировалось arxlex; 17.04.2012 в 16:11.
arxlex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразование из RGB в CMYK на С# Yura_KoT Помощь студентам 2 31.03.2011 23:36
Raw IP пакеты electropunk Работа с сетью в Delphi 0 09.03.2011 18:46
TBitmap -> RAW Celestia Мультимедиа в Delphi 5 17.01.2011 18:59
Преобразование RGB16 в RGB24 . DarkElf_89 Общие вопросы C/C++ 1 22.09.2009 08:32
raw пакет spoool Работа с сетью в Delphi 1 02.12.2008 08:43