Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Excel VBA, CAD, Софт, ОС, Windows, Ubuntu, Android, VPS
Win Api, Assembler, C++, Java, Pascal, Lazarus, Delphi, OpenGL, DirectX
C#, Qt, .NET, ASP.NET, Windows Forms, ADO.NET, Framework, WPF, UWP, WinRT, XAML
HTML, CSS, JavaScript, Ajax, PHP, Perl, Python, Ruby, SQL, WordPress, API, XML, JSON, ActionScript, Flash

Ответ
 
Опции темы
Старый 22.01.2015, 17:27   #1
NIKOLAYY2
Форумчанин
 
Регистрация: 24.12.2014
Адрес: Россия
Сообщений: 220
Репутация: 108
По умолчанию Быстрое отражение изображения

Есть ли какие быстрые способы в делфи отразить по вертикали, горизонтали, перевернуть изображение на 90, 180 градусов, кроме как попиксельная перерисовка?
NIKOLAYY2 вне форума   Ответить с цитированием
Старый 22.01.2015, 17:35   #2
Stilet
Белик Виталий :)
Профессионал
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Адрес: Украина, Донецкая область, г. Краматорск
Сообщений: 57,968
Репутация: 6787
По умолчанию

Есть конечно. Работа с канвой в памяти, а только потом ее отрисовка.
Или есть еще двойная буфферизация. кажется компонент Image этим обладает. Изображение на момент изменения блокируется вызовом спецметодов (не помню их название, что-то типа BeginUpdate), меняется без перерисовки, после чего блок снимается и рисунок выводится на экран уже измененным. Что правда тут я могу путать, ибо с Делфи не работал давненько, и по большему для такого использую отдельный объект TCanvas.
__________________
I'm learning to live...
Stilet вне форума   Ответить с цитированием
Старый 22.01.2015, 22:47   #3
phomm
personality
Профессионал
 
Аватар для phomm
 
Регистрация: 28.04.2009
Адрес: Тюмень
Сообщений: 2,851
Репутация: 1478

icq: 421049471
skype: phomm-
По умолчанию

Флип по осям - тут
Поворот на 180 - тоже самое, что одновременный флип и по горизонтали и по вертикали.

Поворот на 90 не подскажу..
TBitmap.ScanLine вестимо, но Вам, я понял, попиксельно не хотелось... Ну этот способ быстрый, если что.

Если есть большое желание, то стоит взять профессиональную библиотеку. Могу посоветовать FastLib - задачи уровня видеокарты решает на процессоре, а интерфейс близок к привычному канвасу.

Ну и, понятное дело, всегда есть варианты с огл/дх.
phomm вне форума   Ответить с цитированием
Старый 24.01.2015, 05:47   #4
NIKOLAYY2
Форумчанин
 
Регистрация: 24.12.2014
Адрес: Россия
Сообщений: 220
Репутация: 108
По умолчанию

phomm
Так и непонял куда в коде вставлять Image, я хотел с Image1 в Image2 отобразить в перевернутом положении, но не отобразилось ни как.
NIKOLAYY2 вне форума   Ответить с цитированием
Старый 24.01.2015, 16:17   #5
phomm
personality
Профессионал
 
Аватар для phomm
 
Регистрация: 28.04.2009
Адрес: Тюмень
Сообщений: 2,851
Репутация: 1478

icq: 421049471
skype: phomm-
По умолчанию

Имхо, от имеджей надо отказываться полностью.
Лучше брать сразу буферный битмап (обычно размером с экран/клиентскую_часть_формы), и на него врисовывать по нужным координатам битмапы всех объектов ( обычно стоит завести некую структуру из битмапа, координат и прочих свойств объектов), и так каждый такт игры (хотя, конечно, есть более экономичные средства, но пока не об экономии речь), полностью нарисованную картинку в буфбитмапе единожды рисовать на форму через канвас. Ранее в этой же цепочке действий должен находиться обработчик игрового такта - изменение свойств всех объектов, в т.ч. координат.
Все эти принципы, опять же, давно разжёваны, Вы бы потрудились изучить учебные темы в разделе создания игр.

А по теме - функция, которую я привёл - как раз и работает с битмапами, и для описанного способа она вполне неплоха, для имейджей же придётся делать пачку телодвижений - создавать битмап, копировать картинку из имейджа в созданный битмап, кидать его в функцию, и после флипа снова записывать в имейдж. Правда, я не могу сказать с гарантией, что не будет срабатывать подход в лоб: Flip(True, True, MyImage1.Picture.Bitmap), я только подозреваю, что не будет, почему и говорю, что нужны телодвижения.

Последний раз редактировалось phomm; 24.01.2015 в 16:21.
phomm вне форума   Ответить с цитированием
Старый 25.01.2015, 03:11   #6
kropotkina-alice
Участник клуба
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Адрес: в России
Сообщений: 514
Репутация: 493
По умолчанию

Цитата:
Сообщение от NIKOLAYY2 Посмотреть сообщение
Есть ли какие быстрые способы в делфи отразить по вертикали, горизонтали, перевернуть изображение на 90, 180 градусов, кроме как попиксельная перерисовка?
Нате вам простенькую процедурку для отражения без сложных извращений:
Код:

procedure TForm1.FlipBitmap(bmap: TBitmap; FlipHor: Boolean);
var
  x, y, W, H: Integer;
  Pixel_1, Pixel_2: PRGBTriple;
  MemPixel: TRGBTriple;
begin
  bmap.PixelFormat := pf24Bit;
  W := bmap.Width - 1;
  H := bmap.Height - 1;
  if FlipHor then
    for y := 0 to H do
    begin
       Pixel_1 := bmap.ScanLine[y];
      Pixel_2 := bmap.ScanLine[y];
       Inc(Pixel_2, W);
       for x := 0 to W div 2 do
      begin
         MemPixel := Pixel_1^;
        Pixel_1^ := Pixel_2^;
        Pixel_2^ := MemPixel;
        Inc(Pixel_1); 
        Dec(Pixel_2); 
      end;
    end  else
    for y := 0 to H div 2 do
    begin
      Pixel_1 := bmap.ScanLine[y];
      Pixel_2 := bmap.ScanLine[H - y];
      for x := 0 to W do
      begin
         MemPixel := Pixel_1^;
        Pixel_1^ := Pixel_2^;
        Pixel_2^ := MemPixel;
        Inc(Pixel_1);
        Inc(Pixel_2); 
      end;
    end;
end;

Вызов делается так:

procedure TForm1.Button1Click(Sender: TObject);
begin
FlipBitmap(Image1.Picture.Bitmap,False); //отражение по вертикали
Image1.Repaint;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
FlipBitmap(Image1.Picture.Bitmap,True); //отражение по горизонтали
Image1.Repaint;
end;

kropotkina-alice вне форума   Ответить с цитированием
Старый 25.01.2015, 15:23   #7
NIKOLAYY2
Форумчанин
 
Регистрация: 24.12.2014
Адрес: Россия
Сообщений: 220
Репутация: 108
По умолчанию

Вот еще нашел хороший способ:

Код:

var
 a: TBitmap;
 x, y: integer;
 SrcRect, DstRect: TRect;
begin
 if OpenDialog1.Execute = false then
 Exit;
 a := TBitmap.Create;
 a.LoadFromFile(OpenDialog1.FileName);

 X := a.Width;
 Y := a.Height;
 SrcRect := Rect(0, 0, X, Y);
 DstRect := Rect(X, 0, 0, Y);
 form1.Canvas.CopyRect(DstRect, a.Canvas, SrcRect);
 a.Free;
end;

Проверял и оказалось канву можно везде копировать в любом направлении где есть область Rect! Даже где ее и нету ее можно вставить везде где только можно!
Тут главное с какой по какую координату определить, и переуказать если изображение не квадратное и мы поворачиваем на 90 градусов свойства-
Width;
Height;
вторичного прямоугольника.

Последний раз редактировалось NIKOLAYY2; 25.01.2015 в 15:26.
NIKOLAYY2 вне форума   Ответить с цитированием
Старый 08.10.2016, 11:39   #8
KukoBoy
Новичок
 
Регистрация: 08.10.2016
Адрес: Ярославль
Сообщений: 1
Репутация: 10
По умолчанию Последняя процедура отражения

Код:

unit lab3;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, jpeg;

type
  TForm1 = class(TForm)
    Image1:  TImage;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    OpenDialog1: TOpenDialog;
    procedure Button5Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


var Form1: TForm1;

implementation

{$R *.dfm}

{Процедура перевода в чёрно белый спектр}
procedure TForm1.Button1Click(Sender: TObject);
var x,y,r,g,b:integer;
begin
  for x := 0 to Image1.Width do
    for y := 0 to Image1.Height do
    begin
      r:=getRvalue(Image1.Canvas.Pixels[x,y]);
      g:=getGvalue(Image1.Canvas.Pixels[x,y]);
      b:=getBvalue(Image1.Canvas.Pixels[x,y]);

      Image1.Canvas.Pixels[x,y]:=RGB(round(r*0.3),round(g*0.59),round(b*0.11));
    end;

end;

{Процедура перевода с зелёным оттенком}
procedure TForm1.Button2Click(Sender: TObject);
var x,y,r,g,b:integer;
begin
    for x := 0 to Image1.ClientWidth do
      for y := 0 to Image1.ClientHeight do
      begin
        r:=getRvalue(Image1.Canvas.Pixels[x,y]);
        g:=getGvalue(Image1.Canvas.Pixels[x,y]);
        b:=getBvalue(Image1.Canvas.Pixels[x,y]);

        Image1.Canvas.Pixels[x,y]:=RGB(round(r*0.9),g,round(b*0.9));
      end;
end;

{Процедура перевода в негатив}
procedure TForm1.Button3Click(Sender: TObject);
var x,y,r,g,b:integer;
begin
  for x := 0 to Image1.Width do
    for y := 0 to Image1.Height do
    begin
      r:=getRvalue(Image1.Canvas.Pixels[x,y]);
      g:=getGvalue(Image1.Canvas.Pixels[x,y]);
      b:=getBvalue(Image1.Canvas.Pixels[x,y]);

      Image1.Canvas.Pixels[x,y]:=RGB(round(255-r),round(255-g),round(255-b));
    end;

end;

{Процедура отражения}
procedure TForm1.Button4Click(Sender: TObject);
var i,j,r,g,b,r1,g1,b1:integer;
begin
  for i:= 1 to Image1.Width do
    for j:= 1 to Image1.Height do
    begin
      r:=GetRvalue(Image1.Canvas.Pixels[i,j]);
      g:=GetGvalue(Image1.Canvas.Pixels[i,j]);
      b:=GetBvalue(Image1.Canvas.Pixels[i,j]);

      r1:=GetRvalue(Image1.Canvas.Pixels[i,j]);
      g1:=GetGvalue(Image1.Canvas.Pixels[i,j]);
      b1:=GetBvalue(Image1.Canvas.Pixels[i,j]);

Image1.Canvas.Pixels[i,j]:=Image1.Canvas.Pixels[Image1.Height-i,j];
    end;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
  Image1.Picture.LoadFromFile(OpenDialog1.FileName);
end;

end.


Последний раз редактировалось Arigato; 12.10.2016 в 14:20.
KukoBoy вне форума   Ответить с цитированием
Ответ



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зеркальное отражение изображения Neketek Общие вопросы по Java, Java SE 1 06.05.2013 15:02
Отражение данных с термодатчиков SokolGL Фриланс 5 14.03.2012 11:46
Зеркальное отражение V@mpir Общие вопросы Delphi 3 15.09.2009 22:27
Отражение луча Illusionist Общие вопросы Delphi 3 30.05.2009 23:20
Отражение рисунка от стенок Надежда.. Мультимедиа в Delphi 14 21.12.2008 00:24




13:53.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru