Цитата:
Сообщение от 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
Смешная ссылка
