পিএইচজি-র জিডিলিব চিত্রকপিরশিক্ষা ব্যবহারের সময় কি পিএনজি চিত্রের স্বচ্ছতা সংরক্ষণ করা যায়?


101

নিম্নলিখিত পিএইচপি কোড স্নিপেট ব্রাউজার-আপলোড করা পিএনজিকে 128x128 এ পুনরায় আকার দিতে জিডি ব্যবহার করে। এটি দুর্দান্ত কাজ করে, বাদে মূল চিত্রের স্বচ্ছ অঞ্চলগুলি আমার ক্ষেত্রে একটি শক্ত রঙ-কালো দিয়ে প্রতিস্থাপন করা হচ্ছে।

যদিও imagesavealphaসেট করা আছে, কিছু ঠিক নেই isn't

পুনরায় মডেল ইমেজের স্বচ্ছতা সংরক্ষণের সর্বোত্তম উপায় কোনটি?

$uploadTempFile = $myField[ 'tmp_name' ]
list( $uploadWidth, $uploadHeight, $uploadType ) 
  = getimagesize( $uploadTempFile );

$srcImage = imagecreatefrompng( $uploadTempFile );    
imagesavealpha( $targetImage, true );

$targetImage = imagecreatetruecolor( 128, 128 );
imagecopyresampled( $targetImage, $srcImage, 
                    0, 0, 
                    0, 0, 
                    128, 128, 
                    $uploadWidth, $uploadHeight );

imagepng(  $targetImage, 'out.png', 9 );

উত্তর:


199
imagealphablending( $targetImage, false );
imagesavealpha( $targetImage, true );

এটা আমার জন্য। ধন্যবাদ সিজেজোজ

দ্রষ্টব্য, লক্ষ্য চিত্রটির উত্স চিত্র নয়, আলফা সেটিংসের প্রয়োজন।

সম্পাদনা করুন: সম্পূর্ণ প্রতিস্থাপন কোড। নীচে উত্তর এবং তাদের মন্তব্য দেখুন। এটি কোনওভাবেই নিখুঁত হওয়ার গ্যারান্টিযুক্ত নয়, তবে আমার প্রয়োজনগুলি সে সময়ে অর্জন করেছিল।

$uploadTempFile = $myField[ 'tmp_name' ]
list( $uploadWidth, $uploadHeight, $uploadType ) 
  = getimagesize( $uploadTempFile );

$srcImage = imagecreatefrompng( $uploadTempFile ); 

$targetImage = imagecreatetruecolor( 128, 128 );   
imagealphablending( $targetImage, false );
imagesavealpha( $targetImage, true );

imagecopyresampled( $targetImage, $srcImage, 
                    0, 0, 
                    0, 0, 
                    128, 128, 
                    $uploadWidth, $uploadHeight );

imagepng(  $targetImage, 'out.png', 9 );

5
এফআইওয়াই, লক্ষ্য চিত্রটি তৈরি হওয়ার পরে এটি হওয়া দরকার। এই ক্ষেত্রে, এটি ইমেজক্রিটেট্রেকরুর পরে হবে।
রাইজিংসুন

ভাবছেন কেন alphablending = falseএখানে গুরুত্বপূর্ণ? দস্তাবেজটি এতে উল্লেখ করেছে ... " এটির জন্য আপনাকে বর্ণমালা ( imagealphablending($im, false)) আনসেট করতে হবে।"
আশিফাইভ

2
এই উত্তরটি সঠিক এবং দরকারীই নয়, এটি বিশেষত সহায়ক কারণ পিএইচপি ডক্সের উপর প্রথম মন্তব্য (লেখার সময়) imagecreatefrompng()প্রস্তাব দেওয়া হয়েছিল যে imagealphablendingসেট করা উচিত true, যা পরিষ্কারভাবে ভুল। অনেক ধন্যবাদ
spikyjt

3
এই সমাধানটি, আমার ক্ষেত্রে জিডি কেবলমাত্র কাজ করে যদি পিএনজির একটি "নিয়মিত" স্বচ্ছতা অঞ্চল থাকে যেমন পার্শ্ববর্তী স্বচ্ছ অঞ্চলের মতো, যদি এটির কোনও জটিল ক্ষেত্র থাকে যেমন স্বচ্ছতার সাথে চিত্রের অভ্যন্তরের অংশ থাকে তবে এটি সর্বদা ব্যর্থ হয় এবং কালো পটভূমি রাখে উদাহরণস্বরূপ, এই চিত্রটি ব্যর্থ: seomofo.com/downloads/new-google-logo-knockoff.png । কেউ কি এই চেষ্টা করে নিশ্চিত করতে পারেন?
এসিজেড

2
কিছু স্বচ্ছ png ফাইল নিয়ে কাজ করছে বলে মনে হচ্ছে না। আমি একটি জেপিজি থেকে একটি চিত্র তৈরি করার চেষ্টা করেছি এবং ভিতরে একটি স্বচ্ছ png অনুলিপি করেছি। আইসাইড হিসাবে দেখায় ফলাফলটি একটি কালো স্কোয়ার।
রুবেলডিজিটিসি

21

কেন আপনি এত জটিল জিনিস তৈরি করেন? নিম্নলিখিতটি আমি ব্যবহার করি এবং এখনও পর্যন্ত এটি আমার জন্য কাজ করেছে।

$im = ImageCreateFromPNG($source);
$new_im = imagecreatetruecolor($new_size[0],$new_size[1]);
imagecolortransparent($new_im, imagecolorallocate($new_im, 0, 0, 0));
imagecopyresampled($new_im,$im,0,0,0,0,$new_size[0],$new_size[1],$size[0],$size[1]);

কাজ হয়নি, আমি এখনও এই চিত্রের সাথে কালো পটভূমি পেয়েছি
aesede

উভয় সমাধান চেষ্টা করছিল: আপনার এবং দেড় শতাধিক ভোট দিয়ে উপরের একটি। আপনার সমাধানগুলি জিআইএফগুলির জন্য দুর্দান্ত কাজ করে। উপরেরটি পিএনজি ফাইলগুলির সাথে সর্বোত্তমভাবে কাজ করে যখন আপনার সমাধানটি থাম্বনেইস তৈরি করতে (ব্লকি, পিক্সেলিটেড দেখায়) সেরা কী দেখতে পাবেন তা অ্যান্টি-এলিয়জিং হারাচ্ছে।
জনি

11

আমি বিশ্বাস করি এটি কৌশলটি করা উচিত:

$srcImage = imagecreatefrompng($uploadTempFile);
imagealphablending($srcImage, false);
imagesavealpha($srcImage, true);

সম্পাদনা: পিএইচপি ডক্সের কারও দাবি imagealphablendingসত্য হওয়া উচিত, মিথ্যা নয়। YMMV।


2
imagealphablendingসত্য বা মিথ্যা ব্যবহার করে আমি সর্বদা একটি কালো পটভূমি পাই।
এসিজেড

PHP7 - আমাকে জন্য কাজ
Yehonatan

এটির সাথে চারপাশে খেলেছে (পিএইচপি 7..x): পিএনজি: ইমেজল্যাফেবলিংডিং ($ টার্গেটআইমেজ, মিথ্যা); // পিএনজিতে যদি সত্য হয়: কালো পটভূমি জিআইএফ: চিত্রালঙ্কিতযোগ্য ($ টার্গেটইমেজ, সত্য); // জিআইএফ-তে মিথ্যা হলে: কালো পটভূমি
জনি

9

একটি সংযোজন যা কিছু লোককে সহায়তা করতে পারে:

চিত্রটি নির্মাণের সময় চিত্রের অক্ষম টগল করা সম্ভব। আমি যে নির্দিষ্ট ক্ষেত্রে আমার এটির প্রয়োজন ছিল, আমি স্বচ্ছ পটভূমিতে কিছু অর্ধ-স্বচ্ছ পিএনজি সংযুক্ত করতে চেয়েছিলাম।

প্রথমে আপনি মিথ্যাতে চিত্রকল্পযোগ্য সেট করুন এবং সদ্য নির্মিত সত্য রঙের চিত্রটি একটি স্বচ্ছ রঙ দিয়ে পূরণ করুন। চিত্রকল্পযোগ্য যদি সত্য হয় তবে কিছুই হবে না কারণ স্বচ্ছ ফিলটি কালো ডিফল্ট পটভূমিতে মিশে যাবে এবং ফলস্বরূপ কালো হতে পারে।

তারপরে আপনি সত্যের কাছে চিত্রমর্যাদায়ী টগল করুন এবং ক্যানভাসে কিছু পিএনজি চিত্র যুক্ত করুন, কিছু ব্যাকগ্রাউন্ড দৃশ্যমান রেখে (যেমন পুরো চিত্রটি পূরণ না করা)।

ফলাফলটি একটি স্বচ্ছ পটভূমি এবং বেশ কয়েকটি সম্মিলিত পিএনজি চিত্র সহ একটি চিত্র।


6

আমি জেপিইজি / জিআইএফ / পিএনজি সহ copyimageresampleপিএনজি চিত্রগুলির মতো আকার পরিবর্তন করার জন্য একটি ফাংশন করেছি এবং এখনও সেখানে স্বচ্ছতা রেখেছি :

$myfile=$_FILES["youimage"];

function ismyimage($myfile) {
    if((($myfile["type"] == "image/gif") || ($myfile["type"] == "image/jpg") || ($myfile["type"] == "image/jpeg") || ($myfile["type"] == "image/png")) && ($myfile["size"] <= 2097152 /*2mb*/) ) return true; 
    else return false;
}

function upload_file($myfile) {         
    if(ismyimage($myfile)) {
        $information=getimagesize($myfile["tmp_name"]);
        $mywidth=$information[0];
        $myheight=$information[1];

        $newwidth=$mywidth;
        $newheight=$myheight;
        while(($newwidth > 600) || ($newheight > 400 )) {
            $newwidth = $newwidth-ceil($newwidth/100);
            $newheight = $newheight-ceil($newheight/100);
        } 

        $files=$myfile["name"];

        if($myfile["type"] == "image/gif") {
            $tmp=imagecreatetruecolor($newwidth,$newheight);
            $src=imagecreatefromgif($myfile["tmp_name"]);
            imagecopyresampled($tmp, $src, 0, 0, 0, 0, $newwidth, $newheight, $mywidth, $myheight);
            $con=imagegif($tmp, $files);
            imagedestroy($tmp);
            imagedestroy($src);
            if($con){
                return true;
            } else {
                return false;
            }
        } else if(($myfile["type"] == "image/jpg") || ($myfile["type"] == "image/jpeg") ) {
            $tmp=imagecreatetruecolor($newwidth,$newheight);
            $src=imagecreatefromjpeg($myfile["tmp_name"]); 
            imagecopyresampled($tmp, $src, 0, 0, 0, 0, $newwidth, $newheight, $mywidth, $myheight);
            $con=imagejpeg($tmp, $files);
            imagedestroy($tmp);
            imagedestroy($src);
            if($con) {  
                return true;
            } else {
                return false;
            }
        } else if($myfile["type"] == "image/png") {
            $tmp=imagecreatetruecolor($newwidth,$newheight);
            $src=imagecreatefrompng($myfile["tmp_name"]);
            imagealphablending($tmp, false);
            imagesavealpha($tmp,true);
            $transparent = imagecolorallocatealpha($tmp, 255, 255, 255, 127);
            imagefilledrectangle($tmp, 0, 0, $newwidth, $newheight, $transparent); 
            imagecopyresampled($tmp, $src, 0, 0, 0, 0, $newwidth, $newheight, $mywidth, $myheight);
            $con=imagepng($tmp, $files);
            imagedestroy($tmp);
            imagedestroy($src);
            if($con) {
                return true;
            } else {
                return false;
            }
        }   
    } else
          return false;
}

3
এই কোডটিতে কেন প্রশ্নে কোডের তুলনায় স্বচ্ছতা রক্ষা করা হয়েছে তা নির্ধারণ করার জন্য সমস্ত কোডের মাধ্যমে পড়া বাঞ্ছনীয়।
eh9

আমি এই দুটি লাইন এড়িয়ে গেছি এবং এটি এখনও কাজ করেছে: $transparent = imagecolorallocatealpha($tmp, 255, 255, 255, 127); imagefilledrectangle($tmp, 0, 0, $newwidth, $newheight, $transparent);
সান্তিয়াগো আরিজিটি

এই উত্তরটি দেখতে অনেকটা দেখতে স্ট্যাকওভারফ্লো . com/ a/ 279310/470749 এর মতো ।
রায়ান

5

আমি মনে করি এটি সম্ভবত কৌশলটি করতে পারে:

$uploadTempFile = $myField[ 'tmp_name' ]
list( $uploadWidth, $uploadHeight, $uploadType ) 
  = getimagesize( $uploadTempFile );

$srcImage = imagecreatefrompng( $uploadTempFile );

$targetImage = imagecreatetruecolor( 128, 128 );

$transparent = imagecolorallocate($targetImage,0,255,0);
imagecolortransparent($targetImage,$transparent);
imagefilledrectangle($targetImage,0,0,127,127,$transparent);

imagecopyresampled( $targetImage, $srcImage, 
                    0, 0, 
                    0, 0, 
                    128, 128, 
                    $uploadWidth, $uploadHeight );

imagepng(  $targetImage, 'out.png', 9 );

ক্ষতিটি হ'ল চিত্রটি প্রতি 100% সবুজ পিক্সেল ছিনিয়ে নেওয়া হবে। যাইহোক, আশা করি এটি সাহায্য করবে :)


আপনি যদি কোনও অত্যন্ত কুৎসিত রঙ সেট করেন তবে প্রায় কোনও চিত্রই এটি ব্যবহার করবে না এটি খুব সহায়ক হতে পারে।
কোরি

1
গৃহীত উত্তরটি আমার পক্ষে কার্যকর হয়নি। imagecreate(...)কাজের সাথে এই উত্তর ব্যবহার করে । আপনি এমন একটি চিত্র তৈরি করেন যা আপনার বরাদ্দ করা প্রথম রঙে পূর্ণ হয়। তারপরে আপনি সেই রঙটি স্বচ্ছতে সেট করেছেন। যদি লক্ষ্য চিত্রের জন্য বর্ণমালার মান সত্য করে সেট করা থাকে তবে উভয় চিত্র একত্রিত হবে এবং স্বচ্ছতা সঠিকভাবে কাজ করবে।
সুমুরাই 8

2

সংরক্ষণের স্বচ্ছতা রেজিস্ট্রেশন করা, তারপর হ্যাঁ যেমন অন্যান্য পোস্টে বর্ণিত ইমেজসালভ () সত্য হিসাবে সেট করতে হবে, আলফা পতাকা ব্যবহার করার জন্য চিত্রের অক্ষম () মিথ্যাতে সেট করতে হবে অন্যথায় এটি কাজ করে না।

এছাড়াও আমি আপনার কোডে দুটি ছোটখাটো জিনিস চিহ্নিত করেছি:

  1. getimagesize()এর প্রস্থ / উচ্চতা পেতে আপনাকে কল করার দরকার নেইimagecopyresmapled()
  2. $uploadWidthএবং $uploadHeightহওয়া উচিত -1যেহেতু cordinates আরম্ভ করা হয়, মান 0এবং 1, তাই এটি তাদের একটি খালি পিক্সেল মধ্যে কপি হবে। এর সাথে প্রতিস্থাপন করা: imagesx($targetImage) - 1এবং imagesy($targetImage) - 1, আপেক্ষিকভাবে করা উচিত :)

0

এখানে আমার মোট পরীক্ষার কোড। এটা আমার জন্য কাজ করে

$imageFileType = pathinfo($_FILES["image"]["name"], PATHINFO_EXTENSION);
$filename = 'test.' . $imageFileType;
move_uploaded_file($_FILES["image"]["tmp_name"], $filename);

$source_image = imagecreatefromjpeg($filename);

$source_imagex = imagesx($source_image);
$source_imagey = imagesy($source_image);

$dest_imagex = 400;
$dest_imagey = 600;
$dest_image = imagecreatetruecolor($dest_imagex, $dest_imagey);

imagecopyresampled($dest_image, $source_image, 0, 0, 0, 0, $dest_imagex, $dest_imagey, $source_imagex, $source_imagey);

imagesavealpha($dest_image, true);
$trans_colour = imagecolorallocatealpha($dest_image, 0, 0, 0, 127);
imagefill($dest_image, 0, 0, $trans_colour);

imagepng($dest_image,"test1.png",1);

0

উত্সের চিত্র widthএবং heightমানগুলিতে মনোযোগ দিন যা imagecopyresampledফাংশনে পাস হয়েছে । এগুলি যদি প্রকৃত উত্স চিত্রের আকারের চেয়ে বড় হয় তবে চিত্রের বাকী অংশটি কালো রঙ দিয়ে পূর্ণ হবে।


0

আমি সিজেজোজ এবং চেকিসফ্টের উত্তরগুলি একত্রিত করেছিলাম, যা আমার পক্ষে সেরা ফলাফল দিয়েছে। চিত্রালঙ্কযোগ্য () এবং চিত্রসভেফ () ছাড়াই চিত্রটি পরিষ্কার নয়:

$img3 = imagecreatetruecolor(128, 128);
imagecolortransparent($img3, imagecolorallocate($img3, 0, 0, 0));
imagealphablending( $img3, false );
imagesavealpha( $img3, true );
imagecopyresampled($img3, $srcImage, 0, 0, 0, 0, 128, 128, $uploadWidth, $uploadHeight);
imagepng($img3, 'filename.png', 9);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.