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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.07.2014, 13:35   #11
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Вот что я называю перегонять из пустого в порожнее

Пример работы с пикселами.
Код:
const
  PixelCountMax = 32768;
  B = 0;
  G = 1;
  R = 2;
type
  {$ALIGN 1}
  T24bit = array [0..2] of Byte;
  {$ALIGN ON}
  P24bitArray = ^T24bitArray;
  T24bitArray = array [0..PixelCountMax-1] of T24bit;
var
  pic: TPicture;
  bmInp, bmOut: TBitmap;
  h,w,x,y: Integer;
  cl: TColor;
  _24bitArray: P24bitArray;
  _24bit: T24bit;
begin
  if OpenPictureDialog1.Execute then begin
    // вот так вот я получаю Bitmap
    pic := TPicture.Create;
    pic.LoadFromFile (OpenPictureDialog1.FileName);
    bmInp := TBitmap.Create;
    bmInp.Assign(pic.Graphic);
    h := bmInp.Height;
    w := bmInp.Width;

    // готовим другой Bitmap для вывода (для наглядности)
    Image1.Visible := False;
    bmOut := Image1.Picture.Bitmap;
    bmOut.Height := h;
    bmOut.Width := w;

    // многое зависит от формата пиксела
    if bmInp.PixelFormat = pf24bit then begin
      cl := $000000FF;
      // полный проход по Bitmap
      for y := 0 to h-1 do begin
        _24bitArray := P24bitArray(bmInp.ScanLine[y]);
        for x := 0 to w-1 do begin
          _24bit := _24bitArray[x];
          cl := RGB (_24bit[R], _24bit[G], _24bit[B]);
          bmOut.Canvas.Pixels [x,y] := cl;
        end;
      end;
    end
    else begin
      // вам в помощь http://www.delphisources.ru/pages/faq/base/bitmap_scanline_for_pixelformat.html
    end;

    Image1.Show;
    bmInp.Free;
    pic.Free;
  end;
end;
Цвет берем с bmInp, а на экран его (bmInp) так и не выводим, условие соблюдено.

Прикол в том, что без попикселного вывода
Код:
...Pixels [x,y] := cl;
работает раз в 10 быстрее. Так-что если вести речь за скорость, то можно и бес ASM'а обойтись.

Одно не понял, почему TColor хранит цвета RGB в одном порядке, а в TBitmap в другом (BGR).

Последний раз редактировалось Sibedir; 16.07.2014 в 13:45.
Sibedir вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить цвет пикселя у растянутой картинки. N0iD Компоненты Delphi 2 05.06.2014 15:26
как получить цвет пикселя из картинки jpg,не конвертируя в bmp?? Dima_Dima Общие вопросы Delphi 3 27.05.2010 10:49
Получить цвет пикселя(все время 0) garyanikin Общие вопросы Delphi 6 10.05.2010 12:29
Быстро получить цвет пикселя... prizrak1390 Мультимедиа в Delphi 4 09.01.2008 20:28