Показать сообщение отдельно
  #7  
Старый 18.09.2012, 02:49
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Fredwriter
Спасибо, конечно, огромное, за переделку, а не могли бы Вы мне сказать каким нибудь русским предложением, в чём была моя ошибка? Так было бы быстрее. Если не учитывать все мелкие различия, то бросается в глаза следующее, у Вас в функции преобразования нет сжатия.
А какой здесь смысл использовать сжатие? Сжатие нужно только для преобразования Bitmap в Jpeg, а в твоей задаче необходимо обратное преобразование.
Вот в этом коде:
Код:
jpg1:=TJPEGImage.Create;
bmp1:=TBitmap.Create;
jpg1.CompressionQuality:=100;
jpg1.Compress;
Здесь последняя строка лишена смысла - в объект jpg1 ничего не загружали (т.е. пустой), а значит и сжимать нечего, и Compress здесь сработает "вхолостую". А без Compress, также теряют смысл любые присваивания в CompressionQuality.
Цитата:
Сообщение от Fredwriter
Нашел ошибку, оказалось, я когда у меня разные форматы, загружал только jpg, а bmp забыл. Банальная невнимательность.
А ещё нигде не освобождаются jpg1 и jpg2, а значит будут утечки памяти.
Но самое главное, что сам принцип неправильный (поэтому я и переписал исходник вместо того, чтобы просто внести мелкие исправления): не нужно перечислять все возможные комбинации форматов входных картинок, типа:
Цитата:
1) если Картинка1=BMP и Картинка2=BMP тогда <...> иначе
2) если Картинка1=BMP и Картинка2=JPG тогда <...> иначе
3) если Картинка1=JPG и Картинка2=BMP тогда <...> иначе
4) если Картинка1=JPG и Картинка2=JPG тогда <...>
А если нужно будет ввести поддержку ещё одного формата, например PNG? Тогда придётся программировать уже 9 вариантов:
Цитата:
1) если Картинка1=BMP и Картинка2=BMP тогда <...> иначе
2) если Картинка1=BMP и Картинка2=JPG тогда <...> иначе
3) если Картинка1=BMP и Картинка2=PNG тогда <...> иначе
4) если Картинка1=JPG и Картинка2=BMP тогда <...> иначе
5) если Картинка1=JPG и Картинка2=JPG тогда <...> иначе
6) если Картинка1=JPG и Картинка2=PNG тогда <...> иначе
7) если Картинка1=PNG и Картинка2=BMP тогда <...> иначе
8) если Картинка1=PNG и Картинка2=JPG тогда <...> иначе
9) если Картинка1=PNG и Картинка2=PNG тогда <...>
А если добавить поддержку GIF, то уже получается 16 вариантов, и т.д.
Вместо этого достаточно просто описать одну функцию, которая будет преобразовывать любую картинку известного ей формата в Bitmap. Тогда с помощью этой функции преобразуем две нужные картинки в Bitmap'ы, которые и отдаём процедуре AlphaBlend (которая только с Bitmap'ами собственно говоря и умеет работать).
Цитата:
Сообщение от Fredwriter
Здесь написано, что источниковое изображение по любому растянется до исходного, а можно ли сделать, чтобы оно не растягивалось?
Там такого не написано. Там написано:
Цитата:
Если исходный и целевой прямоугольник имеют не один и тот же размер, исходный точечный рисунок растягивается, чтобы соответствовать целевому прямоугольнику.
И это понятно. Если попытаться нарисовать картинку размером скажем 32x32 на прямоугольнике 800x600, то что ему нужно сделать как не растянуться?
Чтобы не растягивалось нужно указывать оба прямоугольника одинаковыми и равными размерам источникового прямоугольника:
Код:
  // Т.е. не так:
  if Windows.AlphaBlend(bmp1.Canvas.Handle, 0, 0, bmp1.Width, bmp1.Height,
    bmp2.Canvas.Handle, 0, 0, bmp2.Width, bmp2.Height, Blend) then

  // а так:
  if Windows.AlphaBlend(bmp1.Canvas.Handle, 0, 0, bmp2.Width, bmp2.Height,
    bmp2.Canvas.Handle, 0, 0, bmp2.Width, bmp2.Height, Blend) then
Цитата:
Сообщение от Fredwriter
Смешная ссылка
Ответить с цитированием