Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> pf1bit и изменение размера - всё становится черным, глюк или моя ошибка? 
:(
    Опции темы
imageman
Дата 1.10.2010, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 30.9.2004

Репутация: нет
Всего: 1



функция для обрезания большого битмапа не работает с pf1bit
Код

procedure CropBitmap(Src:TBitmap;Rect:TRect);
var
    DestBitmap:TBitmap;
begin
     DestBitmap:=TBitmap.Create; 
     DestBitmap.PixelFormat:=pf1bit; // пробовал и без этой строки
     DestBitmap.Assign(src);
     src.Width:=Rect.Right-rect.Left;
     src.Height:=rect.Bottom-Rect.Top;
     src.Canvas.CopyRect(src.Canvas.ClipRect,DestBitmap.Canvas,Rect);
     FreeAndNil(DestBitmap);
end;


Когда на входе цветные или 8-битные изображения - нормально. Когда на входе 1 бит картинка, то после строки src.Width:=Rect.Right-rect.Left; src становится черным и копируется в него тоже черное! И на выходе имеем черный прямоугольник (хотя DestBitmap нормальный!)
PM MAIL   Вверх
x128
Дата 2.10.2010, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 29.9.2009

Репутация: 5
Всего: 7



странно, что у тебя вообще что-то копировалось... или я не до конца понял идею, попробуй так:
Код

procedure CropBitmap(Src:TBitmap;Rect:TRect);
var
    DestBitmap:TBitmap;
begin
     DestBitmap:=TBitmap.Create;
     DestBitmap.PixelFormat:=pf1bit; // пробовал и без этой строки
     DestBitmap.Width:=Rect.Right-rect.Left;
     DestBitmap.Height:=rect.Bottom-Rect.Top;
     DestBitmap.Canvas.CopyRect(DestBitmap.Canvas.ClipRect, src.Canvas, Rect);
     src.Assign(DestBitmap);
     FreeAndNil(DestBitmap);
end;

PM MAIL WWW   Вверх
imageman
Дата 4.10.2010, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 30.9.2004

Репутация: нет
Всего: 1



у меня работает только вот так - первая часть нормально срабатывает, когда pf8bit (с экономией памяти), а вторая часть работает, когда pf1bit (с избыточным DestBitmap.Assign, без которого получается черный квадрат).

Код

procedure CropBitmap(var Src:TBitmap;Rect:TRect);
var
    DestBitmap:TBitmap;
    RectTo:TRect;
begin
  if not (Src.PixelFormat=pf1bit) then
   begin
     RectTo.Left:=0; // копирование себя в себя
     RectTo.Top:=0;  // возможны глюки
     RectTo.right:= Rect.Right-Rect.Left;
     RectTo.Bottom:=Rect.Bottom-Rect.Top;
     Src.Canvas.CopyRect(rectTo,Src.Canvas,Rect);
     Src.Height:=Rect.Bottom-rect.Top;
     Src.Width:=Rect.Right-rect.Left;
   end
  else
  begin
     DestBitmap:=TBitmap.Create;
     DestBitmap.PixelFormat:=pf1bit;
     DestBitmap.Assign(src); // без этой строки черный квадрат
     DestBitmap.Width:=Rect.Right-rect.Left;
     DestBitmap.Height:=rect.Bottom-Rect.Top;
     DestBitmap.Canvas.CopyRect(DestBitmap.Canvas.ClipRect, src.Canvas, Rect);
     src.Assign(DestBitmap);
     FreeAndNil(DestBitmap);
  end;
end;


У кого большой опыт - подскажите, почему так происходит? Почему без DestBitmap.Assign выдает черный квадрат? (Src.PixelFormat=pf1bit) 
PM MAIL   Вверх
x128
Дата 4.10.2010, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 29.9.2009

Репутация: 5
Всего: 7



Видать есть проблема в где-то еще, сама процедура правильная и Assign там бесполезный. Прикрепил рабочий пример, там все наглядно и работает для любых форматов.
з.ы. в примере достаточно загрузить битмап и выбрать формат, потом мышкой выделить фрагмент, при изменении формата пикселей картинка обновится.

Присоединённый файл ( Кол-во скачиваний: 17 )
Присоединённый файл  Crop.zip 240,28 Kb
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0841 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.