2015-04-21 53 views
3

我正在制作电子商务门户网站。我正尝试以不同的分辨率上传图像,这是完全正常的。Laravel 5 - 上传后的模糊图像 - 干预

但问题是,如果我在浏览器上传后查看它,我会看到模糊的图像,这不是我想要的。我希望在上传之后,图像应该清晰可见,不应该模糊。

下面是它的控制器方法:

public function store(AddProductRequest $request) { 
    if(\Auth::guest()) { 
     return redirect('/admin'); 
    } 

    $imageType = [ 
     'thumbnail' => [ 
      'height' => 75, 
      'width' => 75 
     ], 
     'product' => [ 
      'height' => 450, 
      'width' => 450 
     ], 
     'cart' => [ 
      'height' => 200, 
      'width' => 200 
     ] 
    ]; 

    if ($request->file('image_file')) { 
     $fileName = $request->file('image_file')->getClientOriginalName(); 

     $fileName = explode('.', $fileName); 
     $image = \Image::make($request->file('image_file')); 
     $path = public_path('images/uploads/'); 

     foreach ($imageType as $key => $value) { 
      if ($key == 'thumbnail') { 
       $image->resize($value['width'], $value['height'], function($constraint) { 
        $constraint->aspectRatio(); 
       }); 
       $image->save($path.$fileName[0]."-thumbnail-". $value['width'] ."-".$value['height'] .".jpg", 100); 
      } elseif ($key == 'product') { 
       $image->resize($value['width'], $value['height'], function($constraint) { 
        $constraint->aspectRatio(); 
       }); 
       $image->save($path.$fileName[0]."-product-". $value['width'] ."-".$value['height'] .".jpg", 100); 
      } elseif ($key == 'cart') { 
       $image->resize($value['width'], $value['height'], function($constraint) { 
        $constraint->aspectRatio(); 
       }); 
       $image->save($path.$fileName[0]."-cart-". $value['width'] ."-".$value['height'] .".jpg", 100); 
      } 
     } 
    }  

    $product = Product::create($request->all()); 

    $product->tags()->attach($request->input('tags')); 

    \Session::flash('product_added', 'Product has been successfully added in the database.'); 
    return redirect('admin/products'); 
} 

如何避免上载后显示模糊图像?

请帮助我。提前致谢。

+0

任何人都可以帮我吗? –

+0

原始图像的大小是多少?调整大小的图像的大小是多少? –

+0

图像的原始大小是1000x1000。调整后的图像大小是数组中给出的大小。 –

回答

1

当前代码的问题是正在处理相同的图像文件。这会导致原始文件被调整为“缩略图”,然后这个缩略图被调整大小,导致“块状”输出。

答案是为每个“调整大小”操作创建一个原始文件的新“映像”文件。

此外,代码可以简化为生成输出文件名的所有信息都在$imageType数组中。

我没有'框架',所以我改变了函数来获取文件名和输出目录。其实输入文件名是放在一个SplFileInfo结构,所以我可以很容易地访问文件的各个部分,但这只是一个细节。

这里是函数,处理的唯一真正改变是每次从原始图像重新创建'图像'。

<?php 
function store(SplFileInfo $imageFile, 
       $outDirectory) { 

    $imageType = array(
     'thumbnail' => array(
      'height' => 75, 
      'width' => 75 
     ), 
     'product' => array(
      'height' => 450, 
      'width' => 450 
     ), 
     'cart' => array(
      'height' => 200, 
      'width' => 200 
     ) 
    ); 

    if (file_exists($imageFile->getRealPath())) { 

     $fileName = explode('.', $imageFile->getFilename()); 
     $path = $imageFile->getPath(); 

     foreach ($imageType as $key => $value) { 
      $image = Image::make($imageFile->getRealPath()); 
      $image->resize($value['width'], $value['height'], 
        function($constraint) { 
           $constraint->aspectRatio(); 
        }); 
      $outFilename = $fileName[0] ."-{$key}-". 
          $value['width'] ."-". $value['height'] 
          .".". $imageFile->getExtension(); 
      $image->save($outDirectory .'/'. $outFilename, 100); 
     } 
    } 

    return true; 
} 

如果需要,我会显示它的工作。

+1

谢谢先生,你的回答帮助我.. –