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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.11.2013, 15:30   #1
ivt22
Пользователь
 
Регистрация: 23.07.2013
Сообщений: 81
По умолчанию Вырезать кусочек из картинки

Добрый день, раньше этот способ работал, а теперь нет. Где ошибся не пойму. Необходимо вырезать кусочек из картинки:
Код:
var
  BMP: TBitmap;
  bmp2: TBitmap;
  png: TPNGImage;
begin
 BMP := TBItmap.Create();
 bmp2 := TBitmap.Create();

 bmp.LoadFromFile('D:\2.bmp');


        BitBlt(bmp2.Canvas.Handle, 0, 0, 102, 17, bmp.Canvas.Handle, 37, 3, SRCCOPY);
        bmp2.Width:=50;
        bmp2.Height:=10;
        bmp2.SaveToFile('D:\1.bmp');

 BMP.Free;
 Bmp2.Free;
в файл 1.bmp сохраняется картинка с размерами 50 на 10, но абсолютно пустая. Просто белый фон
ivt22 вне форума Ответить с цитированием
Старый 06.11.2013, 09:28   #2
ivt22
Пользователь
 
Регистрация: 23.07.2013
Сообщений: 81
По умолчанию

Да блин я вообще нифига не понимаю вот код. Он из картинки 800 на 600 вырезает 6 меленьких кусочков и код рабочий, всегда все работает.
Код:
  var W,H,i,j: Integer;
  bmp, bmp2: TBitmap;
  crds: array [1..6,1..2] of integer; 
  png: TPNGImage;

begin

  png :=  TPNGImage.Create;
  bmp :=  TBitmap.Create;
  bmp2  :=  TBitmap.Create;
  bmp.LoadFromFile('D:\1.bmp');


  crds[1,1] := 455;
  crds[1,2] := 53;
//


  crds[2,1] := 687;
  crds[2,2] := 298;
//


  crds[3,1] := 448;
  crds[3,2] := 417;
//


  crds[4,1] := 264;
  crds[4,2] := 417;
//


  crds[5,1] := 13;
  crds[5,2] := 300;
//


  crds[6,1] := 262;
  crds[6,2] := 54;
//

  W:=102;
  H:=17;

for i := 0 to 6 do begin
  BitBlt(bmp2.Canvas.Handle, 0, 0, W, H, bmp.Canvas.Handle, crds[i,1], crds[i,2], SRCCOPY);
  bmp2.Width:=W; // уменьшаем его размеры width
  bmp2.Height:=H;
  png.Assign(bmp2);
  png.SaveToFile('D:\TESTCOPYRECT\' + IntToStr(i) + '.PNG');
end;
Затем мне нужно из получившейся маленькой картинки шириной 102 на 17 вырезать еще небольшой кусочек
чуть-чуть изменяю код:
Код:
  bmp.loadfromfile('D:\2.bmp');// другая картинка 102 на 17

  BitBlt(bmp2.Canvas.Handle, 0, 0, W, H, bmp.Canvas.Handle, 20, 0, SRCCOPY);
  bmp2.Width:=82; // уменьшаем его размеры width
  bmp2.Height:=17;
  bmp2.SaveToFile('D:\TESTCOPYRECT\17.bmp');
И ВСЕ УЖЕ НИЧЕГО НЕ РАБОТАЕТ. Я не понимаю где ошибка, я же всего лишь циферки другие поставил, просто создается пустой БМП файл 82 на 17 и хоть об стенку разбейся ничего не работает.
ivt22 вне форума Ответить с цитированием
Старый 06.11.2013, 09:50   #3
ivt22
Пользователь
 
Регистрация: 23.07.2013
Сообщений: 81
По умолчанию

до смешного просто, даже этот код не работает
Код:
  BitBlt(bmp2.Canvas.Handle, 0, 0, 102, 17, bmp.Canvas.Handle, 13, 300, SRCCOPY);
  bmp2.Width:=102; // уменьшаем его размеры width
  bmp2.Height:=17;
  bmp2.SaveToFile('D:\TESTCOPYRECT\17.bmp');
ЛОЛ просто. Я вместо переменных H, W написал их значения вручную и координаты, которые были записаны в массиве в пятом элементе, я тоже прописал вручную и ЛОЛ!!! НИЧЕГО НЕ РАБОТАЕТ. АХАААХ как такое может быть?
ivt22 вне форума Ответить с цитированием
Старый 06.11.2013, 10:39   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

А так?
Код:
  bmp2.Width:=102; // уменьшаем его размеры width
  bmp2.Height:=17;
  BitBlt(bmp2.Canvas.Handle, 0, 0, 102, 17, bmp.Canvas.Handle, 13, 300, SRCCOPY);
  bmp2.SaveToFile('D:\TESTCOPYRECT\17.bmp');
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 06.11.2013, 11:13   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
BitBlt(bmp2.Canvas.Handle, 0, 0, 102, 17, bmp.Canvas.Handle, 13, 300, SRCCOPY);
то, что я выделил, это:
Цитата:
int nXSrc, // x-coordinate of source rectangle's upper-left corner
int nYSrc, // y-coordinate of source rectangle's upper-left corner
координаты левого верхнего угла, ОТКУДА копировать.
как Вы думаете, в картинке размером 102 на 17 если взять угол, начиная с x=13 (ну ладно, это допустимо) и с y=300 (напоминаю, что в исходном изображении высота всего изображения 17) что получите?!?!

поставьте, например, 13, 0 - попробуйте!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.11.2013, 11:30   #6
ivt22
Пользователь
 
Регистрация: 23.07.2013
Сообщений: 81
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
то, что я выделил, это:


координаты левого верхнего угла, ОТКУДА копировать.
как Вы думаете, в картинке размером 102 на 17 если взять угол, начиная с x=13 (ну ладно, это допустимо) и с y=300 (напоминаю, что в исходном изображении высота всего изображения 17) что получите?!?!

поставьте, например, 13, 0 - попробуйте!
в этом случае я картинку 800 на 600 загружал, знаете как получается. Со второго раза получается т.е. если написать вот так:
for i := 0 to 1 do begin
BitBlt(bmp2.Canvas.Handle, 0, 0, 102, 17, bmp.Canvas.Handle, 13, 300, SRCCOPY);
end;

вот так все прекрасно) Дурь, бред и чушь конечно, но факт
ivt22 вне форума Ответить с цитированием
Старый 06.11.2013, 11:36   #7
ivt22
Пользователь
 
Регистрация: 23.07.2013
Сообщений: 81
По умолчанию

Вот код, который я пишу. Необходимо при выполнении условий обрезать кусочек от картинки. Если вручную вводить все картинки по порядку от 1.PNG до 6.PNG то все работает, но вот если заключить в цикл, как я сделал, то почему-то обрезается только первая картинка, а с остальными пятью ничего не происходит((

Код:
var lColor: TColor;
    i, j, z: integer;
    image: TPngImage;
    bmp, bmp2: TBitmap;
begin
  bmp :=  TBitmap.Create;
  bmp2  :=  TBitmap.Create;
  image := TPngimage.Create;
  //bmp.LoadFromFile('D:\2.bmp');

  for z := 1 to 6 do begin //Цикл для обрезки всех шести картинок

      i:=0;
      image.LoadFromFile('D:\TESTCOPYRECT\'+IntToStr(z)+'.PNG');

      while (lcolor <> $00202020) and (lcolor <> clBlack) and (i <> 60) do begin
        lColor := image.Canvas.Pixels[i, 9];
        memo1.Lines.Add(IntToSTr(i)+') '+ColorToString(lColor));
        i := i + 1;
      end;

      bmp.Assign(image);

      for j := 0 to 1 do begin
        BitBlt(bmp2.Canvas.Handle, 0, 0, 102-i, 17, bmp.Canvas.Handle, i+4, 0, SRCCOPY);
        bmp2.Width:=102-i-4; // уменьшаем его размеры width
        bmp2.Height:=17;
        image.Assign(bmp2);
        image.SaveToFile('D:\TESTCOPYRECT\'+IntToStr(z)+'z.PNG');
      end;

      memo1.Lines.Clear;
      showmessage(IntToStr(z));

  end;
  image1.Picture.Assign(image);
ivt22 вне форума Ответить с цитированием
Старый 06.11.2013, 11:36   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

не знаю, при исходной картинке достаточно большого размера у меня всё с первого раза сработало:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
 W,H,i,j: Integer;
  bmp, bmp2: TBitmap;

begin

  bmp :=  TBitmap.Create;
  bmp2  :=  TBitmap.Create;
  bmp.loadfromfile('D:\test2.bmp');// другая картинка 102 на 17

  W := 82;
  H := 17;
  bmp2.Width:=W;
  bmp2.Height:=H;
  BitBlt(bmp2.Canvas.Handle, 0, 0, W, H, bmp.Canvas.Handle, 13, 300, SRCCOPY);
  bmp2.SaveToFile('D:\TESTCOPYRECT\17.bmp');

end;
предоставить пруф?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.11.2013, 11:40   #9
ivt22
Пользователь
 
Регистрация: 23.07.2013
Сообщений: 81
По умолчанию

Что такое ПРУФ?
ivt22 вне форума Ответить с цитированием
Старый 06.11.2013, 11:41   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от ivt22 Посмотреть сообщение
Вот код, который я пишу. Необходимо при выполнении условий обрезать кусочек от картинки. Если вручную вводить все картинки по порядку от 1.PNG до 6.PNG то все работает, но вот если заключить в цикл, как я сделал, то почему-то обрезается только первая картинка, а с остальными пятью ничего не происходит((
Код:
var lColor: TColor;
    i, j, z: integer;
    image: TPngImage;
    bmp, bmp2: TBitmap;
begin
  bmp :=  TBitmap.Create;
  bmp2  :=  TBitmap.Create;
  image := TPngimage.Create;
  //bmp.LoadFromFile('D:\2.bmp');

  for z := 1 to 6 do begin //Цикл для обрезки всех шести картинок

      i:=0;
      image.LoadFromFile('D:\TESTCOPYRECT\'+IntToStr(z)+'.PNG');

      {нужно ОБЯЗАТЕЛЬНО иницилизировать lColor перед использованием!!!
         например, так:}
      lColor := image.Canvas.Pixels[0, 9];

      while (lcolor <> $00202020) and (lcolor <> clBlack) and (i <> 60) do begin
        lColor := image.Canvas.Pixels[i, 9];
        memo1.Lines.Add(IntToSTr(i)+') '+ColorToString(lColor));
        i := i + 1;
      end;

....


p.s.
Цитата:
Что такое ПРУФ?
proof - доказательство/подтверждение...
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вырезать цвет из картинки? jone Мультимедиа в Delphi 2 16.08.2013 07:57
Вырезать из картинки jone Мультимедиа в Delphi 5 05.08.2013 09:23
Кусочек ненависти {tktu Свободное общение 26 27.09.2011 17:09
Кусочек кода на Delphi в С++ Geezer Помощь студентам 1 13.07.2011 23:39
Кусочек кода... 1900s БД в Delphi 0 20.03.2009 17:11